2015-04-24 3 views
6

das erste Bild verwendet self.name zu ändern, und das zweite Bild mit _name zu change.it sollte das gleiche Ergebnis sein, aber das zweite gibt nothing.why?Unterschied zwischen self.variable und _variable, über KVO

enter image description here

enter image description here

hier ist der Code

#import "ViewController.h" 

@interface kvo : NSObject 

@property (nonatomic,strong) NSString *name; 

@end 

@implementation kvo 

- (void)change 
{ 
    _name = @"b"; 
} 

@end 

@interface ViewController() 

@property (nonatomic, strong) kvo *a1; 

@end 

@implementation ViewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    self.a1 = [[kvo alloc] init]; 
    _a1.name = @"a"; 
    [self.a1 addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew context:nil]; 
    [_a1 change]; 
} 

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context 
{ 
    NSLog(@"1"); 
} 

der Unterschied ist self.name und _name im Änderungsverfahren

Edit: es ist nicht die gleiche Frage wie „Was ist Unterschied zwischen _variable & self.vari fähig in Objective-C? [duplizieren] ", ich weiß, das ist über die Getter-Methode und Setter-Methode, und meine Frage ist, dass Setter-Methode feuert die KVO und die _name = @"b" nicht die KVO.

+1

Bitte Postleitzahl als Text, nicht ein Xcode-Screenshot. Text ist einfacher zu schneiden/einfügen und anderweitig zu bearbeiten. – seand

+0

Arun, ich denke das ist eine andere Frage. –

+0

Mit '_name' umgehen Sie kvo – user2829759

Antwort

5

Sie erhalten KVO-Benachrichtigung nur, wenn Sie zugreifen die Instanzvariable durch eine Eigenschaft. Direkte Einstellung von Instanzvariablen nicht aufrufen KVO-Benachrichtigung.

Hier ist der erste Fall, Sie werden von

self.name = @"b"; 

In der Tat den Namen Einstellung dieser die Eigenschaft Setter-Methode aufrufen, wird setName: die intern die KVO-Benachrichtigungensendet. Tatsächlich werden die Meldungen durch die Berufung von Setter-Methode gebrannt ..

Im zweiten Fall

Sie sind das Instanz-Variable direkt einstellen, ohne eine Eigenschaft Setter-Methode. Daher wird die KVO-Benachrichtigung nicht ausgelöst.

Wenn Sie möchten, selbst die Benachrichtigung abfeuern kann

[self willChangeValueForKey:@"name"]; 

_name = @"b"; 

[self didChangeValueForKey:@"name"]; 

Aber ich glaube nicht, es erfordert, setzen Sie die Variable, die die Eigenschaft. Das wird alles für dich tun.
Lesen Sie mehr über KVO notification

0

Um Schlüsselwert zu erhalten Benachrichtigungen für eine Eigenschaft zu beobachten, sind drei Dinge erforderlich:

Schritt 1: Die beobachtete Klasse muss Schlüssel-Wert seine Beobachtung konform für die Eigenschaft das du beobachten möchtest.

Schritt 2: Sie müssen das Beobachtungsobjekt mit dem beobachteten Objekt registrieren, indem Sie die Methode addObserver:forKeyPath:options:context: verwenden.

Schritt 3: Die Beobachtungsklasse muss observeValueForKeyPath:ofObject:change:context: implementieren.

Apple Developer