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