如果委托不再存在会发生什么?

时间:2012-10-18 12:00:51

标签: ios uiviewcontroller delegates crash viewdidload

在处理我的应用时,我遇到了一个有趣的问题。想象一下场景

  • 存在一个对象,让我们称之为A.
  • A,然后创建一个基于委托的类的对象(B),比如说NSURLConnection。
  • 指定自己作为B的代表,前提是A已实施所有必需的委托方法。
  • A要求B开始处理。在我们的例子中,即从某个服务器获取数据。
  • 一旦B完成获取数据,它将调用A的一些指定方法。

在最后一步中,假设在调用A的方法时,B发现A对象不再存在。然后会发生什么?

我不确定但它会导致崩溃吗?

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

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

  • 如果将X的委托分配给nil解决了问题。那在哪里 我应该这样做吗。

简而言之,在视图控制器的卸载阶段同样只调用一次该方法 viewDidLoad处于加载阶段。

3 个答案:

答案 0 :(得分:1)

您不应该达到一个对象持有对另一个对象的引用的情况,该对象可能在没有通知所有者对象的情况下在其他地方解除分配。

取消分配对象A时通知对象B(例如,通过在对象B中创建成员a nill)或将您的设计/流程修改为永不允许{{ 1}}在A完成之前被解除分配(例如,如果可能,在B中指定为委托时保留A

答案 1 :(得分:1)

在课程之间实现这种沟通的最佳方式(A类可以随时解除分配)正在聆听 NSNotifications 。 正如您所说,使用弱(分配)代表是危险的,需要额外考虑 使用强大的委托也可以创建一个内存膨胀(为什么我们应该在从视图中弹出视图控制器这么长时间后保留它?)。

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

答案 2 :(得分:0)

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

if (delegate)
   [delegate method];