2012-10-19 3 views
0

나는 항상 @synthesize을 .h 파일에 선언 된 클래스 속성과 함께 사용했습니다. 어떤 Apple 문서 found here에있는 PhotoPicker 예를보고 매우 혼란스러운 선언을 발견했습니다.Apple 설명서에서 ivars를 해제하고 속성을 nil로 설정

#import <UIKit/UIKit.h> 
@interface AppDelegate : NSObject <UIApplicationDelegate> 
@property (nonatomic, retain) IBOutlet UIWindow *window; 
@end 

을 그리고 자신의 Appdelegate.m 파일이이 쓰기 : 자신의 AppDelegate에 클래스 (.H 파일)가 다음과 같이 어떤 인스턴스 변수, 단지 특성을 생성하지 않는 지금

#import "AppDelegate.h" 

@interface AppDelegate() 
@property (nonatomic, retain) IBOutlet UINavigationController *navController; 
@end 

@implementation AppDelegate; 

을, 나는 내가 dealloc 방법을 보면 그러나 그들은 해제, 어떤 @synthesize 지시, 또는 인스턴스 변수를 찾을 수없는 일부 "보이지 않는"인스턴스 변수 (무엇 ???)

- (void)dealloc 
{ 
    [_navController release]; 
    [_window release]; 

    [super dealloc]; 
} 

그리고의 ViewController 카스티에 그들은 viewDidUnload에 nil 속성을 설정하고 dealloc 메서드에서 (생성되지 않은) "ivars"를 해제합니다.

새로운 Xcode와 관련이 있습니까? 누군가가 이것에 약간의 빛을 비춰 줄 수 있습니까? didReceiveMemoryWarning에 대한 내 논리를 확인하고 있었고 항상 viewDidUnload에 nil 속성을 설정하고 dealloc에 ivars를 릴리스했지만 이전에이 작업을 보지 못했습니다.

미리 도움을 청하십시오.

+0

iOS (5 이상) sdk를 사용하고 계십니까? 나는 xcode가 자동으로 우리를 위해이 기능을 iOS 5에서 소개한다고 생각한다. – kidsid49

+0

속성에 대해 XCode 4.5로 @synthesise 라인이 자동으로 생성된다. – CarlJ

+0

예는 iOS 5.0 SDK를 사용하지만 iOS 4.3을 대상으로한다고 가정 해 보겠습니다. , 내가 선언하지 않더라도 나는 ivar을 내야 하나? –

답변

0

Xcode 4.5는 속성을 자동 합성 할 수 있습니다. 그것은 일반 setter/getter를 생성함으로써 그렇게하며, 앞에 '_'가 붙은 ivar를 생성합니다. 속성의

@synthesize foo=MyFoo; 

이러한 문제 및 메모리 관리에 직교 합성 : 당신이 원하는 무엇이든 바르

@synthesize foo; 

또는 사용을 : 당신이 마음에 들지 않으면, 당신은 당신의 자신을 추가 할 수 있습니다. ARC가 있고 위의 기술이 작동하는 경우 dealloc을 사용할 필요가 없습니다. 그러나 호를 사용하지 않으면 [_foo release]를 사용하여 dealloc에서 객체를 해제해야합니다.

release가 self.foo = nil보다 권장되는 이유는 setter를 사용하면 개체가 정식으로 출시 된 후에 KVO 알림이 생성된다는 것입니다.

+0

그냥 분명해야합니다. 내 코드에서는 ARC를 사용하지 않지만 여전히 '_'가 붙은 ivar를 생성하므로 'viewDidUnload'에서이 속성을 nil로 설정하고'dealloc '에서 해제하거나 두 가지 중 하나만으로 충분합니까? –

+0

자, 가치있는 것이 무엇이든지간에,'@ synthesize' 지시어를 사용하면 dealloc 메소드에서 에러가납니다. 그게 바로 그 반응에 감사드립니다. –

+1

ARC를 사용하지 않으면 super를 호출하는 dealloc을 제공하십시오. @ synthesize를 사용하면 '[foo release]'를 사용하십시오. @ synthesisize를 사용하지 않으면 ivar의 이름이 '_foo'이므로 [_foo release];를 사용하십시오. –

관련 문제