【问题标题】:More than 1 appDelegate object?超过 1 个 appDelegate 对象?
【发布时间】:2009-08-10 11:22:08
【问题描述】:

在修复第三方代码时,我发现了一个绝妙的主意)Guy 在项目 xibs 中使用了 2 个 appDelegate 对象。我想他认为这将是某种单音或类似的。但是在重新思考了那段代码之后,我发现它没有任何技术限制。 这是我的示例:带有 navController 和 2 个视图的简单项目。每个都有它的 viewController。当应用程序启动时,第一个视图出现在屏幕上。当用户点击按钮时,第二个视图被推送到 navController。现在 MainWindow.xib 中有 appDelegate 对象。现在,如果您将相同的 appDelegate 对象添加到第二个视图的 xib。现在,当第二个视图被推送时,您可以看到另外一个 appDelegate 实例被创建和销毁(如果您将覆盖 init 和 dealloc 方法并在那里插入日志)。 在这里,我感到非常惊讶。是不是意味着只能创建一个 appDelegte 实例?如果是,那为什么? appDelegate 只是一个实现 UIApplicationDelegate 协议的 NSObject 子类。

【问题讨论】:

    标签: iphone sdk


    【解决方案1】:

    xCode 在每个 iphone 项目上创建的 appDelegate 对象是应用程序的入口和出口点。拥有多个此类的实例没有任何意义,如果您这样做(除了可能丢失一些应用程序设置之外)应用程序委托给哪个类?为什么只能做一个?这很可能是因为该类正在实现一个单例模式,因此确保只创建一个应用程序委托实例,我敢打赌,即使您尝试分配另一个实例,原始应用程序委托也是唯一保留的一个。您可能可以在苹果网站http://developer.apple.com/iphone 上搜索文档并找到更多信息

    【讨论】:

      【解决方案2】:

      UIApplicationDelegate 是一个协议,本身没有状态,因此没有什么可以阻止您拥有多个状态。将此与具有状态的 UIApplication 和 提供 sharedApplication 单例访问器

      应该完全可以动态替换 UIApplication 的委托属性。不过,我没有看到太多好处。

      【讨论】:

        【解决方案3】:

        我认为这里发生的情况是第二个 Nib 中有一个 AppDelegate 类的实例,但没有其他对象保留它。因此它被创建并立即发布。如果您将保留属性添加到连接到 AppDelegate 的视图控制器,那么它不会立即被释放。

        可以拥有多个实现 UIApplicationDelegate 协议的对象,但通常不会这样做,因为 90% 的行为在所有情况下都是相同的。

        【讨论】:

          【解决方案4】:

          我认为您可以按照以下方式做一些事情:

          • 注意旧的UIApplication.delegate
          • 使用旧委托作为参数创建UIApplicationDelegate 实例。
          • 确保在您实现的每个方法中调用旧委托。
          • 使其返回 - (id)forwardingTargetForSelector:(SEL)aSelector 方法中的旧委托。
          • [UIApplication sharedApplication].delegate 替换为您的。

          它将原始应用程序委托替换为您的,确保仍会调用旧委托,特别是如果您没有覆盖UIApplicationDelegate 协议定义的每个方法。

          【讨论】:

            猜你喜欢
            • 2010-12-23
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-05-29
            • 2018-02-18
            • 2013-03-05
            • 2013-08-08
            • 2014-10-27
            相关资源
            最近更新 更多