我在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];
}
答案 0 :(得分:6)
window
文件中.h
的属性声明为@property (nonatomic, retain) UIWindow *window;
。 window
具有retain
属性。因此,UIWindow
由window
变量的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
转到retainCount
,0
已取消分配。
答案 1 :(得分:1)
每个retain
,alloc
,copy
和new
必须由release
或autorelease
平衡。
所以在你的代码中:
self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
alloc
由autorelease
平衡。
现在对于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释放,以抵消财产的保留性质。