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:

  1. 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.
  2. 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.
InformationsquelleAutor Dave DeLong | 2009-08-16
Schreibe einen Kommentar