3 Stimmen

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

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

self.name = @"hello";

Ich würde gerne wissen, was im magischen Setter-Methoden passiert. Also die Frage lautet: Könnte jemand bitte den Quellcode der Setter-Methode posten? ;-) Vielen Dank!

11voto

dreamlax Punkte 91447

Ohne eine Eigenschaftserklärung (dh Sie haben die Setter- und Getter-Methoden manuell deklariert), würden Sie diese 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 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 namens "setXXX:" definieren müssen, wobei "XXX" der Name Ihrer Eigenschaft ist, der mit einem Großbuchstaben beginnt. Wenn Ihre Eigenschaft beispielsweise "name" heißt, sollte Ihr Setter "setName:" heißen. In dieser Methode sollten Sie die Zuweisung des Arguments an Ihr tatsächliches Ivar vornehmen.

Abgesehen davon hat dreamlax recht, dass noch mehr dazu gehört. 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 ich Ihnen empfehle zu überprüfen:

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