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

Objective c 在向对象发送消息之前检查对象是否已释放,objective-c,cocoa,delegates,Objective C,Cocoa,Delegates,我最近才注意到,当一个对象试图向其委托发送消息时,我的一个应用程序发生崩溃,而该委托已被释放 目前,在调用任何委托方法之前,我运行以下检查: if (delegate && [delegate respondsToSelector:...]){ [delegate ...]; } 但是很明显,如果委托不是nil,但是已经被释放,那么这并不能解释 除了在委托的dealloc方法中将对象的委托设置为nil之外,是否有一种方法可以检查委托是否已被释放,以防我不再引用该对象。如何

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

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

if (delegate && [delegate respondsToSelector:...]){
   [delegate ...];
}
但是很明显,如果委托不是nil,但是已经被释放,那么这并不能解释


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

如何使用计数器,每次分配时递增,每次释放时递减。通过这种方式,您可以检测双allocs,并且可以决定如果计数器不是nil,但地址也不是nil,则不使用委托。无法判断变量是否指向有效对象。您需要对程序进行结构化,以便该对象的委托不会在没有事先通知它的情况下消失。

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

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

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

如果(委托)
是冗余的--
[委托响应选择器:
如果
委托
为零,则将为false。有趣的一点。我以前没想过。谢谢。自从崩溃以来,在委托的dealloc中将对象的委托设置为nil是一个简单的问题,但它让我总体上思考:)遗憾的是,这不是一个好主意。对象跟踪其自己的保留计数,这是在上次发布后它们“自动”释放的方式。因为他没有保留代理,这真的没有多大帮助。是的,这是一个很长的机会,但我想描述一下在一些框架上如何在后台管理引用和取消引用。两年后@tom问了我,我发现这非常有用。我遇到了相同的场景,最好的解决方案是将我的委托属性声明为“弱”,遗憾的是,我需要使其向后兼容(也应该支持iOS 4部署目标)。所以我的猜测是使用块而不是委托模式,这样行吗?(我使用委托在后台下载图像,并在完成后调用委托方法的回调,我也可以使用块来做同样的事情。不确定它是否能解决调用解除分配对象背后的问题)+1,用于调出
\u weak
引用,并在GC上下文中推荐它们。事实上,如果(何时?)代码最终在将来切换到GC,可以认为在这种情况下使用
\uuuu-weak
是正确的做法。对于遗留支持,仍然存在“不安全的”未恢复,并且使用ARC不为收集的“不安全的”未恢复对象分配nil值是相当棘手的。