超过1个appDelegate对象?

时间:2009-08-10 11:22:09

标签: iphone sdk

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

4 个答案:

答案 0 :(得分:0)

xCode在每个iphone项目上创建的appDelegate对象是应用程序的入口和出口点。如果您(除了可能丢失某些应用程序设置)应用程序委托给哪个类,它不会有这个类的多个实例?为什么你只能制作一个?最有可能的原因是这个类在封面下实现了一个Singleton模式,所以确保只有一个app委托实例,我敢打赌,即使你试图分配另一个这样的实例,原始的app代理也是唯一保留的。您可以浏览文档并在http://developer.apple.com/iphone

上找到关于苹果网站的更多信息

答案 1 :(得分:0)

UIApplicationDelegate是一个协议,本身没有状态,因此没有任何东西阻止你拥有它们中的几个。与具有状态和状态的UIApplication相比 提供sharedApplication单例访问器

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

我认为你可以沿着这些方向做点什么:

  • 请注意旧的UIApplication.delegate
  • 使用旧委托作为参数创建UIApplicationDelegate的实例。
  • 确保在您实施的每种方法中调用旧代理。
  • 让它以- (id)forwardingTargetForSelector:(SEL)aSelector方法返回旧代表。
  • 用您的[UIApplication sharedApplication].delegate替换。

它用你的原始app委托代替,确保仍然会调用旧的委托,特别是如果你没有覆盖UIApplicationDelegate协议定义的每个方法。