2012-10-18 136 views
0

我在处理我的应用程序时遇到了一个有趣的问题。想象一个如果委托不存在,会发生什么情况?

  • 存在着一个对象之情况,让我们把它叫做A.
  • A,然后创建一些代表团基于类的一个对象(B),说NSURLConnection的。
  • 如果A已经实现了所有必需的委托方法,A就被指定为B的委托。
  • A要求B开始处理。在我们的例子中,即从某个服务器获取数据。
  • 只要乙完成获取数据时,它将调用A.

的一些指定的方法在最后的步骤中,假设而调用的方法中,B发现目的犯规存在了。那么会发生什么?

我不确定,但会导致崩溃?

如果是,那么请告诉我如何避免这种情况。

在我的情况下,我将viewcontroller分配给某个对象的代理,比方说viewDidLoad方法中的X.在X调用viewcontroller中定义的委托方法之前,有些情况下viewcontroller会被销毁。

  • 如果将X的委托分配给nil解决了问题。然后 我应该这样做。

总之,该方法而在其装载阶段卸载视图控制器同样 viewDidLoad的相位只调用一次。

+1

请注意,NSURLConnection *会保留它的委托。 – Guillaume

+0

@Guillaume是的,你是对的。关于保留代表的全部内容。如果我们将委托设置为零,那么更好。 – harshitgupta

+0

和是否definitelty它会导致崩溃。 – harshitgupta

回答

0

检查一个有效的委托对象应该足够了。

if (delegate) 
    [delegate method]; 
+0

具体说来NSURLConnection类,你的意思是它不会查找viewcontroller或viewcontroller的“ - (void)connectionDidFinishLoading:(NSURLConnection *)连接”方法,如果视图控制器不再存在? – harshitgupta

+0

看看这个线程:http://stackoverflow.com/a/2503709/312312 – Lefteris

+0

如果委托被释放,那么“委托”将指向一些垃圾指针..我想(和MVC的设计模式会)更喜欢使用这种流量的通知。 –

1

你不应该达到,其中一个对象保存到可以在其他地方释放不通知所有者对象另一个对象的引用的情况。

要么当解除分配对象A通知对象B(通过在例如对象B使构件anill)或修改设计/流决不允许A之前B饰面被解除分配(例如,作为在一个代理分配时保持AB如果可能的话)

1

的最佳方式实现这种班(其中A类可以在任何时候被释放之间的通信)是听NSNotifications
如您所述,使用弱(转让)代表是危险的,需要额外的考虑。
使用代表也可以创建一个内存膨胀(为什么我们应该保留一个视图控制器很长时间后从视图中弹出?)。

有关NSNotificationCenter和通知的更多信息,您可以在SDK文档中找到大量信息..对于特定问题,您知道在哪里询问..

相关问题