我应该啥时候释放 [[UIApplication sharedApplication] delegate] 对象?

Posted

技术标签:

【中文标题】我应该啥时候释放 [[UIApplication sharedApplication] delegate] 对象?【英文标题】:When should I release [[UIApplication sharedApplication] delegate] object?我应该什么时候释放 [[UIApplication sharedApplication] delegate] 对象? 【发布时间】:2011-09-10 08:30:09 【问题描述】:

我在我的应用程序中多次使用以下代码(尤其是用于管理 NavigationController):

MyAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate]; 

我应该什么时候发布它?

感谢您的帮助,

斯蒂芬

【问题讨论】:

【参考方案1】:

不要。 从不释放您的应用程序委托 - 它由操作系统自动管理。

如果您查看应用程序的 main.m 文件,您会看到一些代码初始化了一个代表您的应用程序的 UIApplication 实例 - 管理应用程序委托的生命周期是它的责任,而不是您的责任。

EDIT 正如@Goz 指出的那样,如果您在某个时候retain 它,您应该release 它。然而,由于应用程序对象(以及因此,它的委托)保证在应用程序的生命周期内保持在范围内(除非你去搞砸它),最好简单地 对委托进行任何内存管理,因为这样可以避免意外过度释放或其他相关问题的可能性。

【讨论】:

除非你当然对它调用了retain ...然后它需要被释放。 @Goz: 是的,但是你为什么要调用retain呢?保证在应用程序的生命周期内分配它(例如,除非您做一些愚蠢的事情,例如过度释放它......)简单地避免保留/释放很容易防止意外过度释放。 很好的讨论+1。 :) 我认为我不同意。 UIApplicationUIAccelerometerNSFileManager 是单例,如果 Apple 以严格的方式实现它们,则在其上使用 release/retain 应该没有意义,因此 retein 返回 self 和 @987654332 @ 什么也没做。更多关于单身人士在这里developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/… 感谢大家的想法!【参考方案2】:

简短的回答:永远不要释放您的应用程序委托。

说明: 当我检查事物的声明方式时,它通常可以帮助我解决 mem-mgmt 问题。看看delegate 属性是如何为UIApplication 声明的:

@property(nonatomic,assign) id<UIApplicationDelegate> delegate;

如您所见,它是分配的属性,这意味着这里所做的所有 mem-mgmt 只是为实例变量分配指针。这意味着在您的应用程序委托上调用release 将导致为您的MyAppDelegate 执行-dealloc 方法。去调试器试试这个,你会看到你的应用程序会收到 EXC_BAD_ACCESS - 即它会崩溃。

编辑: 但是,正如 Goz 建议的那样,您可以先致电 retain,然后再致电 release。但首先,在应用委托上执行 retain/release 的事情是没有意义的。

【讨论】:

以上是关于我应该啥时候释放 [[UIApplication sharedApplication] delegate] 对象?的主要内容,如果未能解决你的问题,请参考以下文章

返回executeFetchRequest的NSArray:结果时我应该保留,自动释放还是啥都不做?

File.ReadLines 啥时候释放资源

使用自动释放时,它实际上是啥时候释放的?

如果/啥时候释放的堆内存被回收?

java中一个线程啥时候释放资源啊?问题补充中是我情况的说明.

autorelease 对象啥时候释放?