Wie Attribut freizusetzen, das ist Protokoll?
-
05-07-2019 - |
Frage
Ich habe Arbeit für iPhone-Entwicklung für eine Weile. Zum ersten Mal habe ich so überrascht, mit Memory-Management in Objective-c :). aber jetzt habe ich es ein wenig.
Die Frage ist, irgendwann, ich Protokoll als ein Attribut einer Klasse verwenden, weil ich seine Definition denke sehr ähnlich ‚Schnittstelle‘ in C # oder Java. wie unten.
@protocol Shield
...
@end
// Interface
@interface Dragon {
id<Shield> shield
NSString * name;
}
@property (nonatomic,retain) id<Shield> shield;
@property (nonatomic,retain) NSString * name;
@end
, aber ich loslassen alway jedes Attribut Objekt in dealloc () -Methode. wie unten.
-(void)dealloc {
[name release];
[shield release]; // <--- Totally impossible. xcode said '-release not found in protocol'
[super dealloc];
}
Wie Sie sehen, ich konnte nicht das Protokoll freigeben. So würde dies dazu führen, ich künftig Speicherproblem? Haben Sie eine andere Art und Weise haben diese Lösung zu behandeln mich zu beraten?
Lösung
Sie benötigen Protokoll als die Einhaltung der NSObject
Protokoll zu definieren, wie folgt aus:
@protocol Shield <NSObject>
...
@end
Es ist ganz einfach, wenn man weiß wie! ; -)
Edit: Auch sind Sie richtig - Protokolle in Objective-C sind äquivalent zu Schnittstellen in Java und C #
. Ein weiterer edit: Es könnte seltsam schlagen, dies zu tun haben, aber Objective-C ermöglicht mehrere Root-Objekte, so kann man nicht wirklich garantieren, dass jedes Objekt von NSObject
herabkommen wird. Da release
eine NSObject
Methode ist, müssen Sie die verwendete Protokoll definieren, wie auch an das <NSObject>
Protokoll haftet, bevor Sie sicher sein können, es in der Lage sein wird, um die release
Methode zu reagieren.
Andere Tipps
1 die richtige Sache zu tun, statt [Schild release] setzt
self.shield = nil;
2-Auch ändern
@property (nonatomic,retain) id<Shield> shield;
@property (nonatomic,assign) id<Shield> shield;
Dann sind Sie in Ordnung.
edit:
Der Grund, dass Sie vermeiden Halt Delegierten sind, dass Sie ein vermeiden, müssen behalten Schleife:
A erstellt B A setzt sich als B delegieren ... A wird von seinem Besitzer freigegeben
Wenn B A beibehalten hätte, wäre ein nicht freigegeben wird, besitzt als B A, also A ist dealloc würde nie aufgerufen, A und B verursacht lecken.
Sie sollten sich keine Sorgen über A weggeht b / c es B besitzt und somit wird es los in dealloc.
Warum sind Objective -C Delegierten in der Regel die Eigenschaft assign statt behalten gegeben?
Bitte UITableView Klassenreferenz für ein Beispiel Protokollerklärung finden Sie unter:
@property (nonatomic, zuweisen) id