2010-07-16 6 views
9

Ich dachte, hausgemachte @property Setter wurden wie folgt aussehen sollte:Müssen Sie willChangeValueForKey: und didChangeValueForKey:?

-(void) setFoo:(Foo *)newFoo { 

    // Safeguards 
    // ... 

    [self willChangeValueForKey:@"foo"]; 
    // Switcheroo 
    // ... 
    [self didChangeValueForKey:@"foo"]; 
} 

Aber ich sehe Leute eine Menge Code in Blog-Beiträge, die viel länger tun Cocoa habe als ich, wo es ist so:

-(void) setFoo(Foo *)newFoo { 

    // Safeguards 
    // ... 

    // Switcheroo 
    // ... 
} 

Also meine Frage ist, müssen wir die KVO-Benachrichtigungsmethoden aufrufen? Oder wird es magisch gemacht, wenn Sie das private iVar aktualisieren, wenn Sie die moderne Laufzeit verwenden?

Antwort

13

Es ist magisch gemacht, wenn Sie nicht abmelden. Lesen Sie this section des KVO-Leitfadens. Es ist zu beachten, dass KVC/KVO seit undenklichen Zeiten existierte (d. H. Vor der Einführung von), so dass es keine Rolle spielt, ob der Setzer @synthesize d ist oder nicht. Es ist nicht einmal mit der alten/neuen Laufzeitdichotomie verwandt.

Das Detail dieser Magie (isa-swizzling) wurde in einem blog post von Mike Ash beschrieben. Es ist Magie. Wenn ein Schlüssel beobachtet wird, ersetzt die Laufzeit automatisch die Implementierung des Setter, so dass er die KVO-Benachrichtigung aufruft.

+0

Der KVO-Link ist unterbrochen (( – voromax

+0

@voromax) Der Link wurde korrigiert – herzbube

Verwandte Themen