例如,
@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会触发吗?
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
这个方法可以触发KVO
首先你需要知道属性的本质
这个属性添加以后,用起来好像是一个变量,其实编译器做的不仅仅是添加了一个变量:
1. 添加了一个类全局变量
NSMutableArray * _array2. 添加了
Get方法-(NSMutableArray *)array;3. 添加了
Set方法-(void)setArray:(NSMutableArray *)array;分析你的代码
其实是侦听了
MyClass.setArray:方法,MyClass.setArray:方法被调用时,才会触发回调。所以你修改数组里面的数据,是不会引起KVO触发的。1 KVO就是在运行时派生一个子类重写你的setArray方法,从而监听属性改变.
2 所以没有触发这个方法就不会有反应.
3 可变数组不要采用copy策略.
4 可变数组不要采用copy策略.
5 可变数组不要采用copy策略.
指针,不会。
你监控了self,却问array的对象改变会不会出发,你就没有在统一的域中讨论这个问题。你观察的self,只有当自己的属性变化才会触发。对array也是同理
我只想说,NSMutableArray别用copy…