2010-12-05 6 views
3

Wenn Sie ein Objekt mit einer Eigenschaft haben, die einen Retain-Setter hat, welche davon ist Best Practice?Der beste Weg, um Retain-Eigenschaften zu bearbeiten

-(id)init { 
    if((self = [super init])) { 
     self->_retainingProperty = [[NSObject alloc] init]; 
    } 
    return self; 
} 
-(id)init { 
    if((self = [super init])) { 
     self.retainingProperty = [[NSObject alloc] init]; 
     [self.retainingProperty release]; 
    } 
    return self; 
} 
-(id)init { 
    if((self = [super init])) { 
     NSObject *obj = [[NSObject alloc] init]; 
     self.retainingProperty = obj; 
     [obj release]; 
    } 
    return self; 
} 

Alle diese mit einem Release in dealloc gekoppelt werden würde

Vielleicht gibt es eine weitere Möglichkeit, I‘ habe verpasst.

Antwort

4

ich im Allgemeinen nur:

- (id) init 
{ 
    self = [super init]; 

    if (self) 
    { 
     retainingProperty = [[NSObject alloc] init]; 
    } 

    return self; 
} 

würde ich nicht vorschlagen, # 2 oder # 3, es sei denn, Sie wissen, könnten sie KVO Zeug aufrufen, die Sie nicht beabsichtigen.

+0

Ich denke, das ist der Weg zu gehen. Wenn "holdingProperty" während der Lebensdauer des Objekts nicht erneut geändert wird, könnte der Eigenschaften-Setter jedoch nur die Standardzuweisung sein. Aber in diesem Fall muss die Eigenschaft noch in dealloc freigegeben werden, was zu Verwirrung führen könnte ... – Nick

1

Alle oben genannten sind gut und weitgehend gleichwertig. Sie können auch die Membervariable über ihren Namen zugreifen nur:

-(id)init { 
    if((self = [super init])) { 
      _retainingProperty = [[NSObject alloc] init]; 
    } 
    return self; 
} 

Property-Setter sind wirklich nur Bequemlichkeit Methoden, um die behalten/Release Tanz, um sicherzustellen, richtig durchgeführt wird, so dass, wenn Sie Dinge tun, richtig können Sie ohne sie auskommen.

Wenn Sie der Setter-Methode eine benutzerdefinierte Logik hinzugefügt haben, sollten Sie sicherstellen, dass sie aufgerufen wird, indem Sie immer die Syntax für die Eigenschafteneinstellung verwenden. Alternativ können Sie diese Logik in einigen Fällen bewusst umgehen und daher vermeiden, sie zeitweise zu verwenden. Es liegt an Ihnen - was auch immer für Ihren Anwendungsfall funktioniert.

1

Mindestens zwei andere Möglichkeiten kommen mir sofort in den Sinn. Es gibt direkter Zugang Ivar:

- (id) init 
{ 
    if (self = [super init]) 
    { 
     _retainingProperty = [[NSObject alloc] init]; 
    } 
    return self; 
} 

Oder Sie den Autofreigabepool verwenden:

- (id) init 
{ 
    if (self = [super init]) 
    { 
     self._retainingProperty = [[[NSObject alloc] init] autorelease]; 
    } 
    return self; 
} 

auf die Klasse des Objektes Je gibt auch bequeme Methoden gleichwertig zu dieser sein kann.

Persönlich würde ich ziemlich immer mit dem direkten ivar Zugang gehen. Es wird normalerweise als schlechte Form betrachtet, Eigenschaftenzugriffe in init aufzurufen, da sie Nebenwirkungen haben können, die nicht auftreten sollen, während das Objekt unvollständig initialisiert wird.

Ähnliche Überlegungen gelten in dealloc, BTW: es ist besser zu release Ihre Ivars direkt, anstatt mit der Eigenschaft Accessoren.

+0

Ich dachte über die Autorelease-Methode nach. Könnte dies jedoch dazu führen, dass das Objekt länger als nötig herumhängt? – Nick

+1

@Nick Es könnte, aber nur, wenn Sie erwarten, es bald zu ändern. Vorausgesetzt, Sie ordnen es hier etwas zu, das es trotzdem behalten wird, erwarten Sie wahrscheinlich, dass es für ein bisschen bleibt, nein?Die automatische Freigabe wird wahrscheinlich dem Objekt vorausgehen. Im Allgemeinen sind Autorelease-Verzögerungen nicht erwähnenswert, es sei denn, Sie sind sehr eingeschränkt oder verwenden sehr große Objekte. Aber ich empfehle es nicht wirklich in diesem Fall, nur zu beobachten, dass die Möglichkeit besteht. – walkytalky

+0

Ok, danke, verstanden. – Nick

Verwandte Themen