2010-11-12 32 views
16

Warum riskiert dieses allgemeine Eigenschaftsinitialisierungsschema einen Fehler, wenn der synthetisierte Setter versucht, das nicht definierte myArray-Objekt freizugeben? Oder werden Eigenschaftsobjekte automatisch auf Null initialisiert und ich muss das überhaupt nicht tun?Korrekte Syntax für Objective-C-Initialisierungsmethode

@interface myClass : NSObject { 
    NSArray* myArray; 
} 
@property (nonatomic, retain) NSArray* myArray; 
@end 

@implementation myClass 
@synthesize myArray; 
-(id)init { 
    if (self = [super init]) { 
     self.myArray = nil; 
    } 
    return self; 
} 

... 

Antwort

12

Wie bereits erwähnt, ist die Instanzvariable bereits auf initialisiert.

Darüber hinaus sollten as per Apple's documentation Instanzvariablen direkt in einer init-Methode festgelegt werden, da sich die Getter/Setter-Methoden einer Klasse (oder Unterklasse davon) auf eine vollständig initialisierte Instanz stützen können.

+0

Dank. – eclux

+0

"Da sich die Getter/Setter-Methoden einer Klasse (oder Unterklasse davon) auf eine vollständig initialisierte Instanz stützen können" Haben Sie die Quelle dafür? Vielen Dank! –

+0

Ich mache es sicherlich, es ist in der Apple-Dokumentation. Ich bearbeite meine Antwort, um eine Referenz hinzuzufügen. – paulbailey

3

Es ist bereits zu nil initialisiert.

25

Objektinstanzvariablen in Objective-C werden standardmäßig auf nil initialisiert. Darüber hinaus ist Messaging nil erlaubt (im Gegensatz zum Aufruf einer Methode auf null in Funktionsaufruf-Sprachen wie Java, C# oder C++). Das Ergebnis einer Nachricht an nil ist nil, dieser Aufruf [nil release]; ist nur nil, keine Ausnahme.

Auf einer Seite zur Kenntnis, ist es am beste Praxis in -init und -dealloc Methoden Instanzvariablen direkt zuweisen/nennen: für eine schnelle und besonders informative Antwort

-(id)init { 
    if (self = [super init]) { 
     myArray = nil; 
    } 
    return self; 
} 

- (void)dealloc { 
    [myArray release]; 
    [super dealloc]; 
} 
Verwandte Themen