Suche…


Bemerkungen

KVC : - Schlüsselwertcodierung

Normalerweise wird auf Instanzvariablen über Eigenschaften oder Zugriffsmethoden zugegriffen. KVC bietet jedoch eine andere Möglichkeit, auf Variablen in Form von Zeichenfolgen zuzugreifen. Auf diese Weise verhält sich Ihre Klasse wie ein Wörterbuch, und der Name Ihrer Eigenschaft, zum Beispiel "age", wird zum Schlüssel und Wert, den die Eigenschaft enthält, wird zum Wert für diesen Schlüssel.

For example, you have employee class with "age" property. Normally we access like this.
emp.age = @”20″;
NSString age = emp.age; 

But KVC works like this: 
[emp valueForKey:@"age"]; 
[emp setValue:@"25" forKey:@"age"];

KVO : - Schlüsselwertbeobachter

Der Mechanismus, durch den Objekte benachrichtigt werden, wenn eine Eigenschaft geändert wird, wird als KVO bezeichnet. Beispiel: Tastaturbenachrichtigung

Beispielsweise ist ein Personenobjekt daran interessiert, eine Benachrichtigung zu erhalten, wenn die accountBalance-Eigenschaft im BankAccount-Objekt geändert wird. Um dies zu erreichen, muss sich Person Object als Beobachter der Eigenschaft accountBalance der BankAccount registrieren, indem ein addObserver: forKeyPath: options: context: message gesendet wird.

Verwendung des Kontextes für die KVO-Beobachtung

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context

Der Kontext ist wichtig, wenn Sie Ihre Klasse für andere Benutzer versenden. Mit dem Kontext kann Ihr Klassenbeobachter überprüfen, ob er von Ihnen aufgerufen wird.

Das Problem, einen Beobachter nicht zu übergeben, besteht darin, dass, wenn jemand Ihre Klasse unterordnet und einen Beobachter für dasselbe Objekt, denselben Schlüssel registriert und keinen Kontext übergibt, der Superklassenbeobachter mehrfach aufgerufen werden kann.

Eine für Ihre Verwendung eindeutige und interne Variable ist ein guter Kontext.

Für mehr Informationen.

Wichtigkeit und guter Kontext

Beobachten einer Eigenschaft einer NSObject-Unterklasse

Die meisten KVO- und KVC-Funktionen sind bereits standardmäßig in allen NSObject Unterklassen NSObject .

Um eine Eigenschaft namens firstName eines Objekts namens personObject führen Sie dies in der beobachtenden Klasse aus:

[personObject addObserver:self
               forKeyPath:@"firstName"
                  options:NSKeyValueObservingOptionNew
                  context:nil];

Das Objekt, auf das sich self im obigen Code bezieht, erhält dann eine observeValueForKeyPath:ofObject:change:context: -Nachricht, wenn sich der beobachtete Schlüsselpfad ändert.

- (void)observeValueForKeyPath:(NSString *)keyPath
                      ofObject:(id)object
                        change:(NSDictionary<NSString *,id> *)change
                       context:(void *)context
{
    NSLog(@"new value of %@ is: %@", keyPath, change[NSKeyValueChangeNewKey]);
}

"Schlüsselpfad" ist ein KVC-Begriff. NSObject Unterklassen implementieren standardmäßig die KVC-Funktionalität.

Auf eine Instanzvariable mit dem Namen _firstName kann über den Schlüsselpfad @"firstName" .

Eine Getter-Methode mit dem Namen firstName wird aufgerufen, wenn auf den Schlüsselpfad @"firstName" wird, unabhängig davon, _firstName es eine _firstName oder setFirstName Setter-Methode setFirstName .



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow