2009-08-10 86 views
2

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

回答

0

通过Xcode的每个iPhone项目创建的appDelegate对象是应用程序的入口和出口点。如果你这样做(除了可能丢失了一些应用程序设置),那么它不会让这个类有多个实例,这个应用程序委派了哪个类?你为什么只能做一个?很可能这是因为这个类正在实现一个Singleton模式,因此确保只有一个应用程序委托实例被创建,我敢打赌,即使您尝试分配另一个这样的实例,原始应用程序委托也是唯一保留的实例。你也许可以挖过来的文档,并在http://developer.apple.com/iphone

0

UIApplicationDelegate找到关于苹果网站的详细信息是一个协议,没有在自己的状态,所以没有什么阻止你有几个人。将其与具有状态的UIApplication进行对比,并且 提供共享应用程序单例访问器

应该完全有可能立即替换UIApplication的委托属性。虽然我看不到太多的好处。

0

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

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

0

我觉得你可以做下面几行内容:

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

它取代了原来的应用程序委托你,确保老代表将仍然被调用,特别是如果你没有覆盖每一个方法的UIApplicationDelegate协议定义。