2015-04-24 22 views
6

hình ảnh đầu tiên đang sử dụng self.name để thay đổi và hình ảnh thứ hai sử dụng _name to change.it phải là kết quả tương tự, nhưng kết quả thứ hai không có kết quả gì.why?Sự khác biệt giữa self.variable và _variable, về KVO

enter image description here

enter image description here

đây là mã

#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"); 
} 

sự khác biệt là self.name_name trong phương pháp thay đổi

Edit: nó không phải là cùng một câu hỏi như "Điều gì là sự khác biệt giữa _variable & self.vari có thể trong Objective-C? [trùng lặp] ", tôi biết đó là về phương pháp getter và phương pháp setter, và câu hỏi của tôi là tại sao phương thức setter bắn KVO và _name = @"b" không bắn KVO.

+1

Vui lòng đăng mã dưới dạng văn bản chứ không phải ảnh chụp màn hình xcode. Văn bản dễ dàng hơn để cắt/dán và làm việc khác. – seand

+0

Arun, tôi nghĩ đó là một câu hỏi khác. –

+0

bằng cách sử dụng '_name' bạn đang bỏ qua kvo – user2829759

Trả lời

5

Bạn sẽ nhận được thông báo KVO chỉ khi bạn đang truy cập biến cá thể thông qua một tài sản. thiết lập trực tiếp của biến dụ sẽ không gọi KVO thông báo.

đây là trường hợp đầu tiên, bạn đang thiết tên bởi

self.name = @"b"; 

trong thực tế điều này sẽ gọi phương thức setter tài sản setName: gửi nội bộ thông báo KVO didChangeValueForKey. Trên thực tế khi thông báo được sa thải bởi sự kêu gọi của phương pháp setter ..

Trong trường hợp thứ hai

Bạn đang trực tiếp thiết lập các biến Ví dụ, không có một phương pháp setter tài sản. Vì vậy, thông báo KVO sẽ không được kích hoạt.

Nếu bạn muốn, bạn có thể bắn được thông báo một mình

[self willChangeValueForKey:@"name"]; 

_name = @"b"; 

[self didChangeValueForKey:@"name"]; 

Nhưng tôi không nghĩ rằng nó đòi hỏi, đặt biến sử dụng tài sản. Điều đó sẽ làm mọi thứ cho bạn.
đọc về nhiều KVO notification

0

Để nhận key-giá trị quan sát thông báo cho một tài sản, ba điều được yêu cầu:

Bước 1: Lớp quan sát phải là chìa khóa-giá trị quan sát phù hợp cho bất động sản mà bạn muốn quan sát.

Bước 2: Bạn phải đăng ký các đối tượng quan sát với đối tượng quan sát, sử dụng phương pháp addObserver:forKeyPath:options:context:.

Bước 3: Lớp quan sát phải triển khai observeValueForKeyPath:ofObject:change:context:.

Apple Developer

Các vấn đề liên quan