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

Tom*_*ing 5 cocoa delegates objective-c

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

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

if (delegate && [delegate respondsToSelector:...]){
   [delegate ...];
}
Run Code Online (Sandbox Code Playgroud)

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

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

Chu*_*uck 16

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

  • 谢谢.由于崩溃,在委托的dealloc中将对象的委托设置为nil是一件简单的事情,但它让我思考一般:) (2认同)

Bar*_*ark 8

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