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

今天发现了一个内存泄漏,一个实例把自己注册给一个单例的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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • iOS开发中, 之前一直使用swift, 因此对于Objective-C的内存管理机制长期处于混乱的一知半解状态....
    icetime17阅读 885评论 1 8
  • 摘自: http://www.cocoachina.com/ios/20150803/12872.html 说明...
    program袁阅读 888评论 1 3
  • 内存管理 简述OC中内存管理机制。与retain配对使用的方法是dealloc还是release,为什么?需要与a...
    丶逐渐阅读 2,024评论 1 16
  • 漫步在沙滩上,冷风打透了我的外套,看着夕阳下的海滩,思绪回到了今年2月在深圳南澳,海边的酒吧里,夕阳醉了,映红了两...
    爱看云朵阅读 198评论 0 0
  • 青春是写不完的诗 而你是我忘不了的梦 常常在夜里梦到你的双眼 轻抚你的脸庞 天一亮 梦就碎了一地 常常这样想 我们...
    梦魇魑魅阅读 272评论 0 3