Am schnellsten und sichersten wäre es, @synthesize value
an den Anfang Ihrer Implementierung hinzuzufügen, und der Compiler wird diese Methoden automatisch generieren.
Das Problem von Kopie und beibehalten hängt von der Tatsache ab, dass Sie möglicherweise in einem NSMutableString übergeben werden, der seinen Wert ändern würde. Wenn Sie einen Setter für einen 'unveränderlichen' Typ (String, Set, Array, Dictionary) haben, müssen Sie die Semantik copy
verwenden. Das mag zunächst kontraintuitiv erscheinen (warum eine Kopie machen, wenn es unveränderlich ist?), Aber die zu realisierende Sache ist, dass Ihre Klasse davon ausgehen will, dass sie unveränderlich ist, und was hineingegeben wird, ist möglicherweise nicht unveränderlich.
NSMutable-Klassen implementieren den copy
-Selektor, indem sie eine unveränderbare Version dessen, was sie darstellen, zurückgeben. Die unveränderlichen Klassen (NSString, usw.) implementieren copy
mit einem retain
Aufruf. Das heißt, sie sind sehr schnell.
Ihr Setter muss auch value
freigeben, bevor er einen neuen Wert zugewiesen bekommt. Der richtige Code ist:
-(void)setValue:(NSString*)newvalue
{
if (value != newvalue)
{
[value release];
value = [newvalue copy];
}
}
Wenn Sie alle vollständige Kontrolle über die Klassen, die setValue:
und sind absolut sicher, nennen Sie nicht in NSMutableString vorbei, können Sie retain
verwenden, aber es ist am besten Praktiken copy
zu verwenden .
ist es eine gute Idee, immer kopieren zu verwenden? kann ich auch @property (behalten, kopieren, lesen) NSString * Wert, und was wäre der Effekt? danke – derrdji
Das würde nicht kompilieren. Es ist eine gute Idee, die Kopie zu verwenden, wenn Sie erwarten, dass das Element durch die Sichtbarkeit Ihrer Klasse unveränderbar ist. Wenn Sie eine Eigenschaft für etwas haben, das keinen Wert darstellt (z. B. eine UI-Ausgangseigenschaft), verwenden Sie retain. – Jason