移除观察者的方法里,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回答

逆风

2019-05-20

这个我不知道怎么表达。。。

  1. 假若原来数组里只有一个内容,[observers removeObject:info]之后肯定是空的。

  2. 我这里代码,没有调用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,对于下次取数组应该没有影响。

0
2
慕设计0203943
视频里是有重新调用这个objc_setAssociatedObject方法的,这个逻辑上是没啥问题的。我就是看到这里会多想一下,不调用这个方法结果也是一致的~
2019-05-20
共2条回复

kinpowoo

2020-02-21

你不调用objc_setAssociatedObject的话 执行完removeObserver方法后 ,observerArr中的值应该是没有变化的

0
0

面试跳槽提升必备 全面解析iOS中的Runtime机制

高薪职位,复杂业务需求,高性能APP,Runtime技术不可不学。

275 学习 · 48 问题

查看课程