例如,
@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
触发的。