为什么直接修改成员变量的值KVO就监听不到,还有监听view.subviews也监听不到@interface Test : NSObject
   
@property(nonatomic,copy)NSString *name;-(void)changeName:(NSString *)name;@implementation Test
-(void)changeName:(NSString *)name{
    _name=name;          //这个不会回调
//    self.name=name;    //这个可以
}- (void)viewDidLoad {
    [super viewDidLoad];
    _test=[[Test alloc] init];
    [_test addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew context:nil];
    [_test changeName:@"name"];
}

解决方案 »

  1.   

    例如一个Person中,创建一个person,在创建后我们把person添加一个观察者,此时,系统动态的创建一个Person的子类, NSKVONotifying_Person,在这个派生类中,重写基类中任何被观察属性的setter方法,在setter方法中实现真正的通知机制,在该类中重写了监听属性的set方法,来通知监听器,上述代码中直接使用成员变量赋值,不会走属性赋值的逻辑,例如你修改代码:
    self->_name = @“some”;也不会出发kvo
      

  2.   

    self.name=xxx 等同于 self.setName(xxx), 并不是直接赋值的.