美文网首页
关于注册listener造成的内存泄漏

关于注册listener造成的内存泄漏

作者: jokers200 | 来源:发表于2016-08-02 16:11 被阅读235次

    今天发现了一个内存泄漏,一个实例把自己注册给一个单例的Manager作为listener,由于listener都被保存在NSArray中了,所以如果等到dealloc 时再去removeListener就泄漏了。
    那么就需要在dealloc之前找一个合适的时机去removeListener,可是,没找到。。。
    随后又想到,在OC中不是这种情况一般都用delegate吗?delegate是weak的啊,这里是因为保存中array中,所以被strong了,于是从这里入手。

    //@property (nonatomic, strong) NSMutableArray *listeners;
    //使用NSHashTable记录weak引用,防止添加listener后无法释放
    @property (nonatomic, strong) NSHashTable* listeners;
    
    - (NSHashTable *)listeners {
         if (!_listeners) {
            _listeners = [NSHashTable weakObjectsHashTable];
         }
         return _listeners;
     }
    

    搞定,又测试一下listener dealloc之后,hash table中保存的内容就自动被清空了。关于NSHashTable可以参考
    http://www.cocoachina.com/industry/20140605/8683.html

    相关文章

      网友评论

          本文标题:关于注册listener造成的内存泄漏

          本文链接:https://www.haomeiwen.com/subject/lmgfsttx.html