3 Stimmen

Wie schreibe ich meinen eigenen Setter für einen Ivar, d. h.: self.ivar = ...?

Dies ist eine Folgefrage von: Was ist der Unterschied zwischen self.ivar und ivar? :

self.name = @"hello";

Ich würde gerne wissen, was innerhalb der magisch Setter-Methode. Die Frage ist also: Könnte jemand bitte den Quellcode der Setter-Methode posten? ;-) Vielen Dank!

11voto

dreamlax Punkte 91447

Ohne eine Eigenschaftsdeklaration (d. h. Sie haben die Setter- und Getter-Methoden manuell deklariert) würden Sie sie normalerweise wie folgt implementieren:

@interface MyClass : NSObject
{
    NSString *name;
}
- (NSString *) name;
- (void) setName:(NSString *) name;
@end

@implementation MyClass

- (void) dealloc
{
    [name release];
    [super dealloc];
}

- (NSString *) name
{
    return name;
}

- (void) setName:(NSString *) aName
{
    if (aName != name)
    {
        [name release];
        name = [aName retain];
    }
}

@end

Atomare Setter könnten etwa so aussehen:

- (void) setName:(NSString *) aName
{
    @synchronized(self)
    {
        if (aName != name)
        {
            [name release];
            name = [aName retain];
        }
    }
}

3voto

Ryan Punkte 16466

Die grundlegende Antwort ist, dass Sie eine Methode mit dem Namen "setXXX:" definieren müssen, wobei "XXX" der Name Ihrer Eigenschaft ist, der mit einem Großbuchstaben beginnt, z. B. wenn Ihre Eigenschaft "name" heißt, dann sollte Ihr Setter "setName:" heißen. In dieser Methode sollten Sie die Zuordnung des Arguments zu Ihrem eigentlichen Ivar vornehmen.

Allerdings hat dreamlax Recht, dass da noch mehr dahinter steckt. Wenn Sie Ihre Eigenschaft deklarieren, definieren Sie einen Vertrag darüber, wie die Zuweisung in Bezug auf Dinge wie Thread-Sicherheit und Speicherverwaltung funktionieren wird. Apple hat eine großartige Dokumentation zu diesem Thema, die Sie sich unbedingt ansehen sollten:

http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Articles/ocProperties.html%23//apple_ref/doc/uid/TP30001163-CH17-SW14

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X