Eine Frage, über Setter in Objective-C
-
16-09-2019 - |
Frage
Dies ist ein Beispiel von The Objective-C 2.0-Programmiersprache.
Ich frage mich, in dem Setter an der Unterseite, kann ich value = [newValue retain]
verwenden
statt value = [newValue copy]
?
@interface MyClass : NSObject
{
NSString *value;
}
@property(copy, readwrite) NSString *value;
@end
// assume using garbage collection
@implementation MyClass
@dynamic value;
- (NSString *)value {
return value;
}
- (void)setValue:(NSString *)newValue {
if (newValue != value) {
value = [newValue copy];
}
}
@end
Lösung
Der schnellste und sicherste, was zu tun wäre, @synthesize value
an die Spitze Ihrer Implementierung hinzuzufügen, und der Compiler wird diese Methoden automatisch generieren.
Die Frage der Kopie vs. behalten Scharniere auf der Tatsache, dass Sie in einem NSMutableString geführt werden können, die ihren Wert ändern würden. Wenn Sie einen Setter für einen ‚unveränderlich‘ Typen (string, Set, Array, Wörterbuch) haben, müssen Sie copy
Semantik verwenden. Das mag zunächst widersprüchlich anhört (warum eine Kopie machen, wenn es unveränderlich ist?), Aber das, was zu erkennen ist, dass Ihre Klasse zu übernehmen will es unveränderlich ist, und was passiert in nicht wirklich unveränderlich sein.
NSMutable Klassen der copy
Selektor implementieren, indem eine unveränderliche Version zurückzukehren, was sie darstellen. Die unveränderlichen Klassen (NSString, usw.) implementieren copy
mit einem retain
Anruf. Das heißt, sie sind sehr schnell.
Ihre Setter muss auch value
freizugeben, bevor er einen neuen Wert zuweisen. Der richtige Code lautet:
-(void)setValue:(NSString*)newvalue
{
if (value != newvalue)
{
[value release];
value = [newvalue copy];
}
}
Wenn Sie haben die vollständige Kontrolle über alle Klassen, die setValue:
nennen können und sind absolut sicher, dass Sie nicht in NSMutableString vorbei sein, Sie retain
verwenden können, aber es ist am besten Praktiken copy
zu verwenden.
Andere Tipps
Es hängt davon ab. Wenn Sie [newValue retain]
verwenden, kann ein anderes Objekt den Wert dieses NSString
Zeiger ändern. Normalerweise Sie dieses Verhalten nicht haben.
Nein, Ihre Schnittstelle sagt copy
. Wenn jemand in einem NSMutableString passiert, werden Sie sehr unterschiedliche Ergebnisse aus den beiden Methoden erhalten.
Setter-Methode:
-(void)setValue:(NSString*)newvalue{
if (_value != newvalue)
{
[_value release];
_value = nil;
_value = [newvalue copy];
}
}