2010-04-27 97 views
2

我在两个类之间实现了委托回调模式,而不保留委托。但在某些情况下,代表处是交易的。回调处理委托时处理?

(我的情况是,我有一个视图控制器是委托对象,并且当用户按下后退按钮弹出该视图控制器出NavigationController栈)

然后回调方法得到BAD_EXE:

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

我知道委托回调模式是在很多应用程序中实现的。你有什么解决方案?

+0

有人说我们无法测试正在处理的对象实例: http://stackoverflow.com/questions/983333/objective-c-test-for-object-instance-being-dealloced-freed – KONG 2010-04-27 09:55:31

回答

2

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

在大多数情况下,我会想象这不会是一个问题,因为委托人常常是委托对象的唯一所有者。所以当委托被取消分配时,委托对象也会被释放。毕竟,这是委托对象通常只对其代表提供弱引用的原因。

+0

我试试遵循NSURLConnection实现委托 - 回调的方式。使用这个我不必保留委托对象。 A类: Initalize NetworkClass,称它执行任务 NetworkClass * networkObject = [[NetworkClass alloc] init]; [networkObject getSomethingWithDelegate:self]; callbacking当,NetworkClass其传递自于ClassA的 释放 - (无效)networkClass:(NetworkClass *)networkObject didGetSomething:(NSObject的*)返回object { 与返回object [networkObject释放] //做; networkObject = nil; } 但我可能不得不改变这一点,就像你说的那样。 – KONG 2010-04-27 10:31:28

+0

我想释放委托对象时释放委托对象。但是,在某些库中,例如MGTwitterEngine,NSURLConnection,委托对象保留自身,然后我无法释放委托对象。你有什么主意吗? – KONG 2010-04-28 03:34:34

+0

我说你应该把委托属性设置为零(在某些情况下),而不是你应该释放任何东西。你绝不能释放你不拥有的物体。我真的不明白你的问题。 – 2010-04-28 08:59:47

0

我没有Objective-C的知识,但我认为你需要测试self.delegate != nil分别e.g

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

哦,这是最好的重新分配委托,如果它是零。

+0

不,这不会帮助。 'delegate'属性仍然会指向一个内存地址,但该地址处的对象已被释放。如果代表是“无”的,那就不会有问题。 – 2010-04-27 09:55:39

+0

好的。只是想知道,在测试“零”或“空”值以及检查它可以具有其他值会导致问题之前,我遇到了问题。从你说的话我认为这不是Objective-C的问题。 我知道OP说过这个代表已经被释放,但现在我发现情况并非总是如此。 – ChrisBD 2010-04-27 10:28:25

+0

如果&&检查中的第一条语句失败,则不会评估第二条语句。 – quantumpotato 2011-12-29 21:28:34