为什么保留代表是错的什么是所有替代方案......?

时间:2010-05-28 07:56:23

标签: ios objective-c cocoa-touch delegates retain-cycle

我有一个问题让我们假设A和B是2个视图控制器,从A用户推送到B视图控制器,在B中用户通过创建对象C(NSObject类)启动一些下载并将B设置为C的委托(assign ),现在用户想要回到A然后dealloc of B调用对象版本,C委托无法给出回调(崩溃)。我想得到调用并允许用户移动到其他视图控制器,这样我保留了委托C类但保留委托是错误的......

what are all solutions ...

先谢谢。

2 个答案:

答案 0 :(得分:0)

我看到两个选项:

  1. 您不需要下载的数据。解决方案:将委托设置为nil。
  2. 您需要数据。解决方案:您要么设置一个存在的新委托,要么委托应该确保它将存在(例如,作为单身人士)

答案 1 :(得分:0)

这是因为您的架构中存在问题:您将后台下载的全局任务分配给可能存在或可能不存在于内存中的视图控制器。

如果您希望能够继续下载而不管是否存在B,那么:

  1. 创建一个类"下载器"负责下载文件(我相信你在你的例子中称之为C)。
  2. 这样的班级应该有一个类型的代表"弱"因此,如果原始代表离开,应用程序不会崩溃(注意:这仅在您使用ARC时才可用)。如果您需要全局监控下载进度,请切换到NSNotification而不是委托,以便同时监控多个对象。
  3. 在其他地方初始化C的实例:在A中或之前。
  4. 通过创建自定义init方法或@property将B的实例注入B,以便生成B.