2011-11-27 1 views
2

xcode 4.2에서 ARC가없는 빈 템플릿을 사용하여 iPhone 응용 프로그램을 만들었습니다. 참조 계산의 기초를 배우기 때문에 현재 ARC를 사용하지 않습니다. 왜 window왜 응용 프로그램에서 윈도우가 자동으로 렌더링됩니까 : 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; 
} 

를 오토 릴리즈되어 응용 프로그램 위임에서 나는 다음과 같은 방법이 있습니까? AppDelegate가 앞으로 그것을 사용하지 않을 것이기 때문입니까? 그러나 인스턴스 변수에 할당됩니다. 또한 window이 해제 된 dealloc 메소드가 있습니다. 이미 자동 릴리스 된 경우 릴리스되는 이유는 무엇입니까?

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

답변

6

window.h에서 파일의 속성은 @property (nonatomic, retain) UIWindow *window;로 선언된다. window에는 retain 속성이 있습니다. 따라서 UIWindowwindow 변수의 설정 메소드에 의해 유지됩니다. 라인에 새로운 windowalloc ED 때문에 allocretainCount과 때문에 +2retainCount 초래 window 세터 방법의 다른 +1+1self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];을 갖는다. autoreleaseretainCount+1으로 다시 줄이는 것입니다. dealloc에서 retainCount0으로 이동하고 window은 할당 해제됩니다.

+0

감사합니다! 그것은 모든 것을 설명합니다. – jorurmol

+0

직접 할당 된 경우 (self.window = ... 대신 window = ....) 필요할 필요는 없습니다. – jorurmol

+0

맞습니다. 할당 때문에 retainCount가 +1이됩니다. dealloc에서는 0으로 되돌아갑니다. –

0

window은 속성에 의해 유지되므로 생성시이를 유지해야합니다 (이는 alloc/init과 동일합니다). 자동 릴리스 (autoreleased)는 릴리스하는 것보다 쉽기 때문에 (릴리스도 가능). 그것은 재산의 보유 성질에 대응하기 위해 dealloc에서 해제되어야합니다.

1

모든 retain, alloc, copynewrelease 또는 autorelease로 균형해야합니다. 당신이있는 거 코드 그래서


:

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

allocautorelease로 균형됩니다. (AppDelegate에 헤더)

@property (retain, nonatomic) UIWindow *window; 

또는 더 :


당신이 window 속성의 정의를 보면 지금의 dealloc에서 release를 들어, 당신이 그것을 볼 수는 유지 proerty입니다 현대 상당 : (강력한 수단이 경우 유지) 이것은 @prop, 당신은 하나의 뛰어난 retain을 알고 의미

@property (strong, nonatomic) UIWindow *window; 

erty 및 @synthesize는 상용구 코드를 반복 작성해야하는 것을 방지하기위한 것입니다.그래서이 dealloc 방법에 release로 균형해야

:

- (void)dealloc 
{ 
    [_window release]; 
    [super dealloc]; 
} 
관련 문제