首页 > KVO观察的是对象指针的变化,还是对象内容的变化?

KVO观察的是对象指针的变化,还是对象内容的变化?

例如,

@interface MyClass : NSObject
@property(copy) NSMutableArray *array;
@end

@implementation MyClass
@end

@implementation OtherClass {
    MyClass *me;
}
- (instancetype)init {
    self = [super init];
    [me addObserver:self forKeyPath:@"array" options:Old|New context:NULL];
    return self;
}
@end

以上代码中,当 array 指针指向新的 NSMutableArray 时,KVO会被触发。

那么问题来了,当 array 的内容变化时,例如发生 [array addObject:@1024] 这样的情况时,KVO会触发吗?


[[self mutableArrayValueForKey:@"array"] addObject:object];

这个方法可以触发KVO


指针,不会。


我只想说,NSMutableArray别用copy…


你监控了self,却问array的对象改变会不会出发,你就没有在统一的域中讨论这个问题。你观察的self,只有当自己的属性变化才会触发。对array也是同理


1 KVO就是在运行时派生一个子类重写你的setArray方法,从而监听属性改变.
2 所以没有触发这个方法就不会有反应.
3 可变数组不要采用copy策略.
4 可变数组不要采用copy策略.
5 可变数组不要采用copy策略.


首先你需要知道属性的本质

@property(copy) NSMutableArray *array;

这个属性添加以后,用起来好像是一个变量,其实编译器做的不仅仅是添加了一个变量:
1. 添加了一个类全局变量NSMutableArray * _array
2. 添加了Get方法-(NSMutableArray *)array;
3. 添加了Set方法-(void)setArray:(NSMutableArray *)array;

分析你的代码

[me addObserver:self forKeyPath:@"array" options:Old|New context:NULL];

其实是侦听了MyClass.setArray:方法,MyClass.setArray:方法被调用时,才会触发回调。所以你修改数组里面的数据,是不会引起KVO触发的。

【热门文章】
【热门文章】