在向其发送消息之前检查对象是否已被释放

时间:2010-06-02 00:28:16

标签: objective-c cocoa delegates

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

目前,在调用任何委托方法之前,我运行此检查:

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

但显然这并不能说明代表是否为零,但已被解除分配。

除了在委托的dealloc方法中将对象的委托设置为nil之外,有没有办法检查委托是否已经被释放,因为我不再有对该对象的引用。

4 个答案:

答案 0 :(得分:16)

没有。无法判断变量是否指向有效对象。你需要构建你的程序,这样这个对象的委托就不会在不先让它知道的情况下消失。

答案 1 :(得分:8)

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

对于调试建议,您可以覆盖类上的释放方法,以查看它何时被调用。

-(oneway void)release
{
    NSLog(@"release called");
    [super release];
}