现在的位置: 首页 > 综合 > 正文

delegate 的 “魔鬼引用”

2013年10月01日 ⁄ 综合 ⁄ 共 375字 ⁄ 字号 评论关闭

之前烦了一个很容易忽略的问题 就是关于对象的释放时候 忘记了检查此对象是否是另外一个对象的delegate, 否则会造成 大家常说的 魔鬼引用


例如,如果A是B的delegate。那么在A的dealloc里面一定要设置
b.
delegate = nil;然后在释放b。

- (void)dealloc {
   b.delegate = nil;
   [b release];
   ......
}

虽然在大多数情况下,[b release]都会导致b直接被释放了,因此是否将b的delegate设置为nil都不影响结果。
但是,随着程序的变化,难保某一天A被释放之后,B没有被释放,那么当b在调用delegate的函数的时候,可能就出现crash了。

今天我就遇到了这样的情况,因为我执行了一个NSNotification,其中b作为参数传入了。此时b就被另外保存了,进而引起了bug。

抱歉!评论已关闭.