请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

移除观察者的方法里,objc_setAssociatedObject是否可以不调用?

-(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回答

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

  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 回复 有任何疑惑可以回复我~
  • 逆风 #1
    你可以下载工程代码的,多参考下,工程代码和我这里是一模一样的。
    回复 有任何疑惑可以回复我~ 2019-05-20 09:57:43
  • 提问者 慕设计0203943 #2
    视频里是有重新调用这个objc_setAssociatedObject方法的,这个逻辑上是没啥问题的。我就是看到这里会多想一下,不调用这个方法结果也是一致的~
    回复 有任何疑惑可以回复我~ 2019-05-20 11:12:12
kinpowoo 2020-02-21 15:37:30

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

0 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信