我应该啥时候释放 [[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。 :) 我认为我不同意。UIApplication
、UIAccelerometer
和 NSFileManager
是单例,如果 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:结果时我应该保留,自动释放还是啥都不做?