2011-11-27 40 views
2

我已经创建了一个iphone应用程序,使用xcode 4.2中没有ARC的空模板。我目前没有使用ARC,因为我想了解引用计数的基础知识。在应用程序委托我有以下方法:为什么窗口在应用中自动释放:didFinishLaunchingWithOptions:并在dealloc中释放?

- (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将来不会使用它吗?但它被分配给一个实例变量。还有一个dealloc方法,window发布。为什么当它已经被自动发布时被释放?

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

回答

6

window.h文件的属性被声明为@property (nonatomic, retain) UIWindow *window;window有一个retain属性。所以UIWindowwindow变量的setter方法保留。 在线路self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];windowalloc ED具有retainCount因为alloc和另一+1因为导致+2retainCountwindow setter方法+1autorelease将减少retainCount返回到+1。在dealloc中,retainCount转到0,并且window被解除分配。

+0

谢谢!这解释了一切。 – jorurmol

+0

如果它被直接赋值(window = ....而不是self.window = ...)它不是必要的吗? – jorurmol

+0

对,由于alloc,retainCount将为+1。在dealloc中会回到0。 –

0

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

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,作为@prop erty和@synthesize是否会阻止你必须反复编写样板代码。

因此,这必须由releasedealloc方法来平衡:

- (void)dealloc 
{ 
    [_window release]; 
    [super dealloc]; 
} 
相关问题