今天發(fā)現(xiàn)了一個內(nèi)存泄漏,一個實例把自己注冊給一個單例的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中保存的內(nèi)容就自動被清空了。關(guān)于NSHashTable可以參考
http://www.cocoachina.com/industry/20140605/8683.html