为啥窗口在 application:didFinishLaunchingWithOptions: 中自动释放并在 dealloc 中释放?
Posted
技术标签:
【中文标题】为啥窗口在 application:didFinishLaunchingWithOptions: 中自动释放并在 dealloc 中释放?【英文标题】:Why is window autoreleased in appliciation:didFinishLaunchingWithOptions: and released in dealloc?为什么窗口在 application:didFinishLaunchingWithOptions: 中自动释放并在 dealloc 中释放? 【发布时间】:2011-11-27 22:01:08 【问题描述】:我在 xcode 4.2 中使用没有 ARC 的空模板创建了一个 iphone 应用程序。我目前没有使用 ARC,因为我想学习引用计数的基础知识。在应用程序委托中,我有以下方法:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
// Override point for customization after application launch.
self.window.backgroundColor = [UIColor whiteColor];
[self.window makeKeyAndVisible];
return YES;
为什么window
自动释放?是因为 AppDelegate 将来不会使用它吗?但它被分配给一个实例变量。还有一个释放window
的dealloc方法。既然已经自动释放了,为什么还要释放?
- (void)dealloc
[_window release];
[super dealloc];
【问题讨论】:
【参考方案1】:.h
文件中window
的属性声明为@property (nonatomic, retain) UIWindow *window;
。 window
有一个 retain
属性。所以UIWindow
被window
变量的setter 方法保留。
在self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
行中,新的window
alloc
ed 在retainCount
中有+1
,因为alloc
和另一个+1
因为window
设置器方法导致+2
@9876 @。 autorelease
是将retainCount
减少回+1
。在 dealloc
中,retainCount
转到 0
并且 window
被释放。
【讨论】:
谢谢!这就解释了一切。 如果直接赋值(window = ....而不是self.window = ...)就没有必要了吧? 对,因为分配,retainCount 会是 +1。在 dealloc 中会回到 0。【参考方案2】:每个retain
、alloc
、copy
和new
,必须由release
或autorelease
平衡。
所以在你的代码中:
self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
alloc
由autorelease
平衡。
现在对于 dealloc 中的 release
,如果您查看 window
属性的定义,您会看到它是一个保留的属性:(在您的 AppDelegate 标头中)
@property (retain, nonatomic) UIWindow *window;
或更现代的等价物:(在这种情况下,强表示保留)
@property (strong, nonatomic) UIWindow *window;
这意味着您知道有一个出色的retain
,因为@property 和@synthesize 可以阻止您一遍又一遍地编写样板代码。
所以这必须通过dealloc
方法中的release
来平衡:
- (void)dealloc
[_window release];
[super dealloc];
【讨论】:
【参考方案3】:window
由属性保留,因此在创建它时不应保留 t (这是 alloc/init 所做的)。它是自动发布的,因为它比发布更容易(发布也可以)。它必须在 dealloc 中释放以对抗属性的保留性质。
【讨论】:
以上是关于为啥窗口在 application:didFinishLaunchingWithOptions: 中自动释放并在 dealloc 中释放?的主要内容,如果未能解决你的问题,请参考以下文章