2010-11-24 3 views
0

Ich versuche, die empfohlene Vorgehensweise zum Festlegen von Standardwerten für NSString-Eigenschaften zu ermitteln.Festlegen von Standardwerten für NSString-Eigenschaften

Ich verstehe, dass es nicht sicher ist, Accessor-Methoden in einer Klasse init-und Dealloc-Methoden zu verwenden. Ich habe oft String-Konstanten, denen ich Standardwerte zuweisen möchte. Was ist der empfohlene Weg dies zu tun (unter Berücksichtigung der iVar wird in der Dealloc-Methode veröffentlicht werden)?

Zum Beispiel habe ich folgendes verstehen ist unsicher:

@property (nonatomic, copy) NSString *identifier; 
.... 

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

    if (self != nil) 
    { 
     self.identifier = @"fireSpell01"; 
    } 

    return self; 
} 

es in Ordnung ist, oder empfehlen, dies zu tun:

identifier = [@"fireSpell01" retain]; 

Oder muss ich dies tun:

identifier = [[NSString stringWithString:@"fireSpell01"] retain]; 

Antwort

3

Tun Sie das einfach:

identifier = @"fireSpell01"; 

Die Zeichenfolge retain ist nicht erforderlich. String-Konstanten existieren für die Lebensdauer des Programms und müssen niemals beibehalten oder freigegeben werden. Doing [[NSString stringWithString:@"fireSpell01"] retain] erstellt nur eine unnötige Kopie und ist sinnlos.

Was Sie vermeiden möchten, ist die Verwendung der Eigenschaft Setter in den init und dealloc Methoden. Da Setter möglicherweise Nebenwirkungen haben können, die von bestimmten Statuswerten abhängen, möchten Sie sie nicht auf teilweise konstruierten/teilweise zerstörten Objekten aufrufen. Es ist viel besser, nur direkt den Ivars zuzuweisen und die Setter während init zu überspringen.

+0

Ist es in Ordnung, wenn eine Freigabe beim Identifizieren (während des Deallocs) aufgerufen wird, als sie direkt zugewiesen wurde, wie Sie vorschlagen? –

+0

@Jay Ja. Es ist sicher, 'retain' und' release' für String-Konstanten aufzurufen. Es würde sonst keinen Sinn ergeben - eine Methode, die einen 'NSString *' empfängt, weiß nicht, wie sie zugewiesen wurde und muss in der Lage sein, sie auf die gleiche Weise zu behandeln. – walkytalky