移除观察者的方法里,objc_setAssociatedObject是否可以不调用?
来源:8-8 模拟KVO的实现-实际运用
慕设计0203943
2019-05-19
-(void)cf_removeObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath;方法里,
NSMutableArray *observers = objc_getAssociatedObject(self, &KVO_observerArr);
if (!observers||observers.count <=0) {
return;
}
for (CFObserveInfo *info in observers) {
if ([info.keyPath isEqualToString:keyPath]) {
[observers removeObject:info];
// objc_setAssociatedObject(self, &KVO_observerArr, observers, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
break;
}
}
其中observers指针是指向objc_setAssociatedObject方法调用的内存空间,操作observers指针时,即对其指向的内存空间做操作。我再for循环之后,重新调用objc_setAssociatedObject来获取观察者数组,并跟踪其值,是空数组。
2回答
-
这个我不知道怎么表达。。。
假若原来数组里只有一个内容,[observers removeObject:info]之后肯定是空的。
我这里代码,没有调用objc_setAssociatedObject,视频里我没看,可能有区别吧。
```
- (void)cf_removeObserver:(NSObject *)observer forKey:(NSString *)key
{
NSMutableArray *observers = objc_getAssociatedObject(self, &KVO_observerArr);
if (!observers) return;
for (CFObserverInfo *info in observers) {
if([info.key isEqualToString:key]) {
[observers removeObject:info];
break;
}
}
/*
*当observers为空时,重新设置isa
*/
if([observers count]<=0)
{
object_setClass(self, [self class]);
}
}
```
其次,你要是在for循环里重新调用objc_setAssociatedObject,对于下次取数组应该没有影响。
022019-05-20 -
kinpowoo
2020-02-21
你不调用objc_setAssociatedObject的话 执行完removeObserver方法后 ,observerArr中的值应该是没有变化的
00
相似问题