2010-06-09 3 views
1

저는 iPhone의 메모리 관리를 처음 사용하고 표준/정확성에 대해 질문했습니다.iphone @property (보유), init() 및 표준

내 헤더 파일 선언

self.tabBarController = [[UITabBarController alloc] init]; 
[tabBarController release]; 
NSLog(@"Retain count of tbc: %d",[tabBarController retainCount]); 

하나에 다시 유지 수를 얻을 :

내 초기화() 코드에서
IBOutlet UITabBarController *tabBarController; 
@property (nonatomic, retain) UITabBarController *tabBarController; 

나는 다음과 같은 일을하고 있었다. 이것이 표준화의 관점에서 올바른가? 그것은 조금 다른 모습으로 보였습니다. 그러나 저는 이것에 처음 접했습니다.

감사

답변

2

속성에 할당를 들어,

self.tabBarController = [[[UITabBarController alloc] init] autorelease]; 

또는

[tabBarController release]; 
tabBarController = [[UITabBarController alloc] init]; 

(첫번째 이전 값을 해제하는 것을 잊지 마십시오) 사용해야 하나

Th 인스턴스 변수를 보존/해제하는 것은 프로퍼티 설정자/getter가 전적으로 책임 져야합니다. 여러분 (또는 다른 누군가)이 속성 설정자를 변경하지 않고 입력 사본을 유지하도록 변경하면 어떻게됩니까? 이 경우 인스턴스 변수를 과도하게 해제하고 원래 객체를 누출하게됩니다.

본질적으로 개인적인 부작용이있는 메시지를 보내고 다음 줄에 인스턴스 변수를 공개하여 해당 개인 정보에 대한 정보를 사용하고 있습니다. 당신은 클래스의 전체 제어 할 수 있습니다하더라도, 당신은 여전히 ​​추상화와 캡슐화의 기본 원칙을 준수해야

[self setTabBarControler:[[UITabBarController alloc] init]]; 
/* Relying on knowledge of the instance variable is bad here, setTabBarController 
    might do something different in the future */ 
[tabBarController release]; 

: 즉 코드는 동일합니다. 인스턴스 변수의 유지/해제는 기본 속성 구현으로 남겨 둡니다.

+0

init 메소드의 첫 번째 라인에서 인스턴스 변수를 해제하는 것은 미친 이야기입니다. – hooleyhoop

+0

나는 책에서 배우고 책은 @property()를 푸시합니다. 이 표기법을 실제로 사용해야합니까? 또는 alloc init을 직접 처리할까요? – inyourcorner

+1

@property()는 접근 자 메서드의 구문 설탕입니다. 그래서 질문은 Setter 접근 자 메소드 (속성을 사용하는 것이 당신을 위해 무엇을 할 것인가)를 사용하는 것인가 (alloc/init을 처리해야하는지)하는 것인가? 일반적으로 setter 메소드를 사용하여 속성의 관찰자에게 업데이트 알림을 제공 할 수 있지만 init 메서드에서는 관련이 없습니다. 또한 setter 메서드가 하위 클래스에서 재정의 된 경우 하위 클래스가 초기화되기 전에 setter 메서드가 호출되므로 해당 메서드가 잘못됩니다. – hooleyhoop

1

tabBarController = [[UITabBarController alloc] init]; 

?

+0

이것은 나에게도 의미가 있습니다. 이렇게하면 합성 된 setter 방법을 생략 할 수 있습니다. 이 경우 나는 보유 수를 확인했다. 그것은 현재 2에 있었고, 나 스스로 이상한 나 자신을 풀어 냈다. 나는 팁을 주셔서 감사합니다 - 지금이 길로 가고 있습니다. – inyourcorner

1

당신은 init() 메서드에서이 암시 적 세터 구문을 사용하지 않는 것이 좋습니다. 세터를 재정의하고 개체가 완전히 초기화되지 않은 경우 작동하지 않을 수도 있기 때문입니다.

그냥 수행

tabBarController = [[UITabBarController alloc] init]; 
+0

잘못된 위치에 넣고 두 번 이상 호출하면 이전 값이 누설 될 수 있습니다. 예를 들어보기 컨트롤러에서는 awakeFromNib에서는 괜찮지만 viewDidLoad에서는 정상입니다. – progrmr

+1

@progrmr :'init()'메소드를 참조하고 있는데'tabBarController'는'init()'이 호출되기 전에 다른 값을 가지지 않았을 것입니다. –

3

그건 정상입니다.

당신은 무엇을 :

id *tempVar = [[UITabBarController alloc] init]; 
self.tabBarController = tempVar;     //till now, retainCount is 2 
[tabBarController release];      //now, retainCount is 1 

당신이 그것을 ALLOC

는,이 메모리 블록이 임시 VAR에 의해 유지됩니다 :

self.tabBarController = [[UITabBarController alloc] init]; 
[tabBarController release]; 

는 아마로 컴파일러에 의해 수행.그래서 더 좋은 방법은 다음과 같습니다 :

UITabBarController *tabCtl = [[UITabBarController alloc] init]; 
self.tabBarController = tabCtl; 
[tabCtl release]; 

나는 객체에 대한 전문가가 아니며, 컴파일에 대한 지식이 있습니다. 그래서, 제가 틀렸다면, 전문가들은 지적합니다.