【问题标题】:handle when callback to a dealloced delegate?何时回调已解除分配的委托?
【发布时间】:2010-04-27 09:36:05
【问题描述】:

我在两个类之间实现了委托回调模式,但没有保留委托。但在某些情况下,委托被解除分配。

(我的情况是我有一个 ViewController 是委托对象,当用户按下后退按钮将该 ViewController 从 NavigationController 堆栈中弹出时)

然后回调方法get BAD_EXE:

if (self.delegate != nil && [self.delegate respondsToSelector:selector]) {
    [self.delegate performSelector:selector withObject:self withObject:returnObject];
} 

我知道委托回调模式在很多应用程序中都实现了。您对此有何解决方案?

【问题讨论】:

标签: iphone objective-c callback delegates


【解决方案1】:

通常,委托应始终在其dealloc 方法中将其与其委托对象解除关联。所以你的视图控制器应该检查它的dealloc是否被设置为委托类的委托,如果是,将委托属性设置为nil

在大多数情况下,我认为这不会成为问题,因为委托通常是委托对象的唯一所有者。因此,当委托被解除分配时,委托对象也将被解除分配。毕竟,这就是委托对象通常只持有对其委托的弱引用的原因。

【讨论】:

  • 我尝试遵循 NSURLConnection 实现委托 - 回调的方式。使用它我不必保留委托对象。 ClassA:初始化NetworkClass,调用它执行任务NetworkClass *networkObject = [[NetworkClass alloc] init]; [networkObject getSomethingWithDelegate:self];回调时,NetworkClass 将自身传递给 ClassA 中的释放 - (void)networkClass:(NetworkClass *)networkObject didGetSomething:(NSObject *)returnObject { // do with returnObject [networkObject release];网络对象 = 无; } 但我可能不得不改变它来做你说的。
  • 我试图在释放委托对象时释放委托对象。但是,在某些库中,例如 MGTwitterEngine、NSURLConnection,委托对象保留自身,然后我无法释放委托对象。你有什么想法吗?
  • 我说你应该将delegate属性设置为nil(在某些情况下),而不是你应该释放任何东西。您绝不能释放您不拥有的对象。老实说,我不明白你的问题。
【解决方案2】:

我没有objective-c知识,但我认为您需要单独测试self.delegate != nil,例如

if (self.delegate != nil)
{
 if ( [self.delegate respondsToSelector:selector]) 
 {
    [self.delegate performSelector:selector withObject:self withObject:returnObject];
 }
}

哦,如果代理为 nil,最好重新分配代理。

【讨论】:

  • 不,这无济于事。 delegate 属性仍将指向内存地址,但位于该地址的对象已被释放。如果代表是nil,就没有问题。
  • 好的。只是想知道,在测试“nil”或“null”值以及检查它是否可以具有另一个值会导致问题之前,我遇到过这个问题。从你所说的我认为这不是objective-c的问题。我知道 OP 说委托已被解除分配,但现在我发现情况并非总是如此。
  • 如果 && 检查中的第一个语句失败,则不会计算第二个语句。
猜你喜欢
  • 1970-01-01
  • 2013-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多