ios - KVO观察的是对象指针的变化,还是对象内容的变化?
怪我咯
怪我咯 2017-04-17 15:17:07
[iOS讨论组]

例如,

@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会触发吗?

怪我咯
怪我咯

走同样的路,发现不同的人生

全部回复(6)
天蓬老师
[[self mutableArrayValueForKey:@"array"] addObject:object];

这个方法可以触发KVO

伊谢尔伦

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

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

黄舟

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

伊谢尔伦

指针,不会。

天蓬老师

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

天蓬老师

我只想说,NSMutableArray别用copy…

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号