Come rilasciare l'attributo che è protocollo?
-
05-07-2019 - |
Domanda
Lavoro per lo sviluppo di iPhone da un po '. La prima volta, sono rimasto così sorpreso dalla gestione della memoria in object-c :). ma ora l'ho preso un po '.
La domanda è, a volte, uso il protocollo come attributo di una classe, perché penso che la sua definizione sia molto simile all '"interfaccia" in C # o Java. come sotto.
@protocol Shield
...
@end
// Interface
@interface Dragon {
id<Shield> shield
NSString * name;
}
@property (nonatomic,retain) id<Shield> shield;
@property (nonatomic,retain) NSString * name;
@end
ma rilascio sempre qualsiasi oggetto attributo nel metodo dealloc (). come sotto.
-(void)dealloc {
[name release];
[shield release]; // <--- Totally impossible. xcode said '-release not found in protocol'
[super dealloc];
}
Come vedi, non sono riuscito a rilasciare il protocollo. Quindi questo mi causerebbe un futuro problema di memoria? Hai un altro modo di gestire questa soluzione per consigliarmi?
Soluzione
Devi definire il tuo protocollo come aderente al NSObject
protocollo, in questo modo:
@protocol Shield <NSObject>
...
@end
È semplice quando sai come! ; -)
Modifica: inoltre, hai ragione: i protocolli in Objective-C sono equivalenti alle interfacce in Java e C #.
Un'altra modifica: potrebbe sembrare strano doverlo fare, ma Objective-C consente più oggetti root, quindi non puoi effettivamente garantire che ogni oggetto scenderà da release
. Poiché <NSObject>
è un metodo <=>, devi definire il tuo protocollo come anche aderente al protocollo <=> prima di poter essere sicuro che sarà in grado di rispondere al metodo <=>.
Altri suggerimenti
1-la cosa giusta da fare invece di [release dello scudo] sta impostando
self.shield = nil;
2-Cambia anche
@property (nonatomic,retain) id<Shield> shield;
a
@property (nonatomic,assign) id<Shield> shield;
Allora stai bene.
modifica:
Il motivo che eviti di conservare delegati è che è necessario evitare a keep loop:
A crea B A si imposta come B delegato & # 8230; A è rilasciato dal suo proprietario
Se B avesse mantenuto A, A non lo sarebbe rilasciato, poiché B possiede A, quindi A dealloc non verrebbe mai chiamato, causando la perdita di A e B.
Non dovresti preoccuparti che A se ne vada b / c possiede B e quindi si libera di esso in dealloc.
Perché sono obiettivi -C I delegati di solito assegnano la proprietà invece di conservare?
consultare il riferimento della classe uitableview per una dichiarazione di protocollo di esempio:
@property (nonatomic, assegnato) id < & UITableViewDelegate gt; delegato