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
War es hilfreich?

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];

        }
   }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top