5

我最近才注意到我的一个应用程序发生崩溃,当时一个对象试图向它的委托发送消息并且委托已经被释放。

目前,就在调用任何委托方法之前,我运行了这个检查:

if (delegate && [delegate respondsToSelector:...]){
   [delegate ...];
}

但显然,如果委托不是 nil,但已被解除分配,这并不能说明问题。

除了在委托的方法中将对象的委托设置为 nil 之外dealloc,还有一种方法可以检查委托是否已经被释放,以防万一我不再引用该对象。

4

4 回答 4

16

不,没有办法判断变量是否指向有效对象。您需要构造您的程序,以便该对象的委托不会在不事先通知的情况下消失。

于 2010-06-02T00:39:30.003 回答
8

我假设您没有使用GC。在这种情况下,标准约定是设置委托的代码负责nil在允许解除分配委托之前设置委托用户的引用。如果您使用 GC,则可以使用__weak委托的引用,允许垃圾收集器将引用设置为nil实例被垃圾收集的时间。

于 2010-06-02T00:43:15.960 回答
0

如何使用每次分配时递增和每次释放时递减的计数器。这样,您可以检测到双重分配,并且如果计数器不是 nil 但地址也不是 nil,则可以决定不使用委托

于 2010-06-02T00:36:30.267 回答
0

for debug 建议您可以覆盖类上的 release 方法以查看何时调用它。

-(oneway void)release
{
    NSLog(@"release called");
    [super release];
}
于 2013-04-09T21:38:36.253 回答