0

我在开发我的应用程序时遇到了一个有趣的问题。想象一下那里的风景

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

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

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

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

在我的情况下,我将视图控制器分配为某个对象的委托,例如viewDidLoad方法中的 X。在某些情况下,视图控制器在 X 调用视图控制器中定义的委托方法之前被销毁。

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

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

4

3 回答 3

1

您不应该遇到这样一种情况,即一个对象持有对另一个对象的引用,该对象可能在其他地方被释放而没有通知所有者对象。

在解除分配对象时A通知对象Ba nill例如,通过在对象 B 中创建成员)或修改您的设计/流程以在完成之前永远不允许A被解除分配(例如,如果可能,在分配为委托时B保留)AB

于 2012-10-18T12:15:47.720 回答
1

实现类之间这种通信的最好方法(类 A 可以随时被释放)是监听NSNotifications.
正如您所说,使用弱(分配)代表是危险的,需要额外考虑。
使用委托也可能造成内存膨胀(为什么我们要在从视图中弹出视图控制器后保留这么长时间?)。

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

于 2012-10-18T13:03:27.510 回答
0

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

if (delegate)
   [delegate method];
于 2012-10-18T12:03:35.257 回答