Gültigen Verwendung von Accessoren in init und dealloc-Methoden?
Ich gehört habe jetzt aus mehreren Quellen (stackoverflow.com, cocoa-dev, die Dokumentation, blogs, etc), dass es "falsch" zu verwenden, Zugriffsfunktionen und-Einstellungen (foo, setFoo:) in deinem init und dealloc-Methoden. Ich verstehe, dass es es gibt eine entfernte Möglichkeit, zu verwirrend, andere Objekte, beobachten die Eigenschaft, wenn Sie so tun. (ein einfaches Beispiel ist gegeben hier)
Allerdings muss ich sagen, dass ich nicht einverstanden mit dieser Praxis aus folgendem Grund:
Die neue Objective-C-Laufzeit (die man auf dem iPhone und dem 64-bit-Laufzeit in 10.5) können Sie erklären Eigenschaften ohne erklärt, eine entsprechende ivar. Zum Beispiel die folgende Klasse kompilieren just fine auf 10.5 oder für das iPhone (Gerät, nicht simulator):
@interface Foo : NSObject { }
@property (retain) id someObject;
@end
@implementation Foo
@synthesize someObject;
@end
Verständnis, dass die oben ist ein perfekt gültiges Objective-C-Klasse, sagen wir mal ich entscheide mich für das schreiben einer Initialisierung, und für Speicher-management-Zwecke, eine dealloc-Methode hinzu (seit der GC ist nicht verfügbar auf dem iPhone). Alles, was ich je gelesen habe über Initialisierungen und Freigabe führen würde, der mich zum schreiben der folgenden zwei Methoden:
- (id) init {
if (self = [super init]) {
//initialize the value of someObject to nil
[self setSomeObject:nil];
}
return self;
}
- (void) dealloc {
//setting someObject to nil will release the previous value
[self setSomeObject:nil];
[super dealloc];
}
Jedoch anhand der Dokumentation und der landläufigen Meinung, dies ist "falsch". Also meine Fragen sind diese:
- Wie soll ich die initialisieren someObject ohne Verwendung der accessor? Man könnte sagen, dass der compiler (oder der runtime-oder was auch immer) wird sichergestellt, dass someObject bereits auf null, aber ich glaube, es wäre unangemessen Verhalten verlassen sich auf. Mit einer anständigen hintergrund in C, ich habe eine ganze Reihe von Fehlern aufgrund nicht richtig initialisieren von Variablen, und diese scheint ein wenig anders.
- Wie kann ich loslassen someObject wenn ich mich nicht sollen die accessor in der dealloc-Methode hinzu?
Wenn die Antwort auf diese beiden "können Sie nicht", wie kann Sie dann schlecht sein, zu verwenden Accessoren in deine init und dealloc-Methoden?
- Synthetisiert Eigenschaft Speicher verfügbar, für die 64-bit-apps auf Leopard und höher. Es ist nicht ein 10,6 Sache.
- danke, das bisschen rutschte mein Verstand. Ich habe bearbeitet die Frage.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich verstehe, dass die aktuelle 10.5 Verhalten, unter denen die synthetisierten ivars sind nicht direkt zugänglich ist als die von Apple ein Fehler zu sein; Sie sollten in der Lage sein, um direkt darauf zugreifen, kann aber nicht.
Daher, Sie sollten in der Lage sein zu tun:
statt
In der Zwischenzeit, mit Hilfe der accessor-direkt ist der einzige Weg, es zu tun, ohne eine explizite ivar.
Update: Dieser bug wurde behoben, Sie können jetzt tun
someObject = nil
gut.-dealloc
Methode. Sorry, aber diese Mittel, die ich zu vergeben haben, die akzeptierte Antwort auf Rob statt. developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/...BEARBEITEN (Feb 13, 2013): Wie bereits in meinem Kommentar unten, und vor allem, da die Zugabe von ARC, ich habe meine Meinung geändert, die auf dieser. Vor der ARC, sah ich eine Menge von crash-Fehler verursacht durch falsche ivar Aufgaben in
init
. IMO, vor allem die Arbeit mit den junior-teams, die selten Probleme bei der Verwendung von Accessoren ininit
wurden aufgewogen durch die gemeinsamen Fehler von ivar Zugang. Da ARC beseitigt, diese Arten von bugs, die seltene, aber mögliche bugs, dass die Verwendung von accessor ininit
verursachen kann, sind wichtiger, und so habe ich eingeschaltet und unterstützt die direkte Verwendung von ivars ininit
unddealloc
, und nur in diesen Orten; Zugriffsmethoden, wie überall sonst, ist das auch möglich (natürlich kannst du nicht verwenden Zugriffsmethoden innerhalb der accessor selbst....)PRE-ARC beantworten
Ich Stimme überhaupt nicht mit denen, die Objekt-Accessoren in
-init
. In fast allen Fällen ist dies ein sehr guter Ort, um Accessoren verwenden, und es spart eine Menge Fehler, die ich gesehen habe, in dem neuen Cocoa-Programmierer, die immer scheitern, Sie zu behalten, wenn die Zuordnung in-init
.-dealloc
ist ein schwieriger Anruf. Ich habe eine Natürliche Neigung zu verwenden Accessoren es (so dass Sie überall verwendet werden), aber es kann auch Kopfschmerzen verursachen wegen der KVO (oder sogar NSNotifications wenn Sie die post eine Benachrichtigung ändern in Ihrem setter). Sagte, dass, während ich nicht verwenden Accessoren in-dealloc
ich halte es für sehr fraglich, und Apple ist sehr uneinheitlich darüber (wir wissen, dass Sie anrufensetView:
im UIViewController ist-dealloc
zum Beispiel).In jedem Fall, würde ich sagen, dass unter Verwendung von Accessoren verursacht hat 100x die Käfer des über-Einsatz. Ich würde immer err Richtung mit Ihnen, außer wenn es einen starken Grund es nicht zu tun.
init
.dealloc
, woself.var = nil;
wird gültig sein, auch wennvar
zugeordnet ist und nicht gespeichert werden, während[var release];
nicht sein würde.init
, wie die Konstruktion ist robuster als in C++, wo Unterklassen werden können, in einem völlig undefinierten Zustand.