为啥窗口在 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 属性。所以UIWindowwindow 变量的setter 方法保留。 在self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease]; 行中,新的window alloced 在retainCount 中有+1,因为alloc 和另一个+1 因为window 设置器方法导致+2 @9876 @。 autorelease 是将retainCount 减少回+1。在 dealloc 中,retainCount 转到 0 并且 window 被释放。

【讨论】:

谢谢!这就解释了一切。 如果直接赋值(window = ....而不是self.window = ...)就没有必要了吧? 对,因为分配,retainCount 会是 +1。在 dealloc 中会回到 0。【参考方案2】:

每个retainalloccopynew,必须由releaseautorelease 平衡。


所以在你的代码中:

self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];

allocautorelease 平衡。


现在对于 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 中释放?的主要内容,如果未能解决你的问题,请参考以下文章

为啥在 JavaScript 中将全局变量添加到窗口对象?

PyQt:为啥新窗口在打开后立即关闭[重复]

electron 在windows下窗口为啥不能拖动

无法关闭窗口 - 为啥?

为啥不能在 vue 模板中使用窗口?

在mfc中 为啥关闭子窗口连带把主窗口关闭了??