【问题标题】:why retain of delegate is wrong what are all alternatives...?为什么保留代表是错误的所有替代方案是什么...?
【发布时间】:2010-05-28 07:56:23
【问题描述】:

我有一个问题,假设 A 和 B 是从 A 用户推送到 B 视图控制器的 2 个视图控制器,在 B 用户通过创建对象 C(它是 NSObject 类)开始一些下载并将 B 设置为 C 的委托(分配),现在用户想回到A然后B的dealloc调用对象释放,C委托未能给予回调(崩溃)。我想得到调用并允许用户移动到其他视图控制器,这样我就可以保留委托C 类但保留委托是错误的...

what are all solutions ...

提前致谢。

【问题讨论】:

  • 如何接受答案....我试着告诉它需要至少 15 个声誉才能投票答案...
  • @jeeva stackoverflow.com/faq - 请参阅“如何使用”部分

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


【解决方案1】:

我看到两个选项:

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

【讨论】:

    【解决方案2】:

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

    如果您希望无论 B 是否存在都能够继续下载,那么:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-13
      • 2018-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-08
      相关资源
      最近更新 更多