为什么在应用程序中自动释放窗口:didFinishLaunchingWithOptions:并在dealloc中释放?

时间:2011-11-27 22:01:09

标签: iphone ios xcode xcode4.2 autorelease

我在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];
}

3 个答案:

答案 0 :(得分:6)

window文件中.h的属性声明为@property (nonatomic, retain) UIWindow *window;window具有retain属性。因此,UIWindowwindow变量的setter方法保留。 在self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];window alloc ed +1 retainCount因{4}而alloc+1因{导致window +2的{​​{1}} setter方法。 retainCount是将autorelease缩减回retainCount。在+1 dealloc转到retainCount0已取消分配。

答案 1 :(得分:1)

每个retainalloccopynew必须由releaseautorelease平衡。


所以在你的代码中:

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

allocautorelease平衡。


现在对于dealloc中的release,如果你看一下window属性的定义,你会看到它是一个保留的proerty :(在你的AppDelegate头文件中)

@property (retain, nonatomic) UIWindow *window;

或更现代的等价物:(在这种情况下强势意味着保留)

@property (strong, nonatomic) UIWindow *window;

这意味着你知道有一个未完成的retain,因为@property和@synthesize会阻止你不得不一遍又一遍地编写样板代码。

所以必须通过release方法中的dealloc来平衡:

- (void)dealloc
{
    [_window release];
    [super dealloc];
}

答案 2 :(得分:0)

window由属性保留,因此在创建它时,不应该保留t(这是alloc / init所做的)。它是自动释放的,因为它比仅仅释放更容易(释放也会起作用)。它必须以dealloc释放,以抵消财产的保留性质。