2010-02-17 6 views
4

objective-c에서 init/retain/copy를 해제해야한다는 것을 알고 있습니다. return 진술을하기 전에 그렇게해야합니까? release을 명시 적으로 호출하고 autorelease을 사용하지 않는 것을 이해하고 싶습니다.반환 전에 지역 변수를 공개 하시겠습니까?

-(void) someMethod 
{ 
    AnotherClass* ac = [[AnotherClass alloc] init]; 
    if([ac somethingHappens]){ 
    // Do I need to release ac here? 
    return; 
    } 
    [ac doSomethingElse]; 
    [ac release]; 
} 

고마워요!

+0

위의 코드에서 하나의 명시 적 경로와 하나의 암시 적 경로가 여러 개의 반환 경로를 갖는 것은 바람직하지 않습니다.당신은 [release] 아래로 리턴을 옮겨야합니다. 각각 반복되는 if() 문장이 반복적 인 코드라고 생각하십시오. –

+0

따라하기 힘든 이유는 무엇입니까? 논리가 똑같이 복잡하다면 다음과 같이 보입니다. –

+0

복사 할 장소가 30 개 있고 릴리스 코드 블록을 지나칠 때 유지 관리 할 수 ​​없으며 한 가지 더 추가 할 때 [릴리스]해야하므로 이제 30 개를 업데이트해야합니다. DRY 교장 (자신을 반복하지 마십시오)에 위배됩니다. 반환 값이있는 더 좋은 방법은 논리에서 반환 값을 설정 한 다음 [릴리스] 블록의 단일 지점 직후에 함수의 맨 아래에 해당 값을 반환하는 것입니다. –

답변

3

예, 변수를 해제해야하지만 메소드를 종료해야합니다.

꽤 간단합니다. 초기화 할 때 보유 개수가 증가합니다. 당신이 그것을 풀어 줄 때. 0에 도달하면 자동으로 해제 (해제)됩니다.

위의 코드에서 변수를 초기화하지만 반환 경로를 따르는 경우 변수 개수가 0이되지 않으므로 결코 할당이 취소되지 않습니다.

+0

사실, 뭔가를 초기화 할 때가 아니라 뭔가를 할당 할 때입니다. 만약 당신의'init' 메쏘드가'[super init]'을 호출하지 않는다면, 보유 카운트는 여전히 1입니다. – dreamlax

+0

오! 그거 알아두면 좋을거야. 위의 내 게시물을 수정했습니다. –

+0

@Stephen, 고마워. 그게 내가 알아야 할 것이 었어. 나는 그것을 더 잘 이해한다. –

2

오른쪽으로 분리하는 방법 등 UISearchBar 객체 setPlaceholder 같은 객체 정의 방법

[self.theSearchBar setPlaceholder:placeHolder]; 

을이 변수를 전달 이제 다음

NSString *placeHolder = [NSString stringWithFormat:@"%@ %@",[someObject value1], [someObject value2]]; 

같이 할당 된 로컬 변수를 가질 가정하자 방법은 할당 된 문자열 'placeHolder'?

당신이 그것을 autoreleas을 가정하는 경우 :

NSString *placeHolder = [[NSString stringWithFormat:@"%@ %@",[someObject value1], [someObject value2]] autorelease]; 

당신이

[self.theSearchBar setPlaceholder:placeHolder]; 
[placeHolder release]; 

는 A 후 다른 곳으로 전달 된 변수를 해제 생각하면 bad_exc_access

실패합니다 코드 런타임 예외도 throw됩니다.

무엇이 잘못 되었나요?

문제는 보유 수입니다. UISearchBar 객체가 아직 할당, 그래서 당신이 해제 또는 자동 해제 등의 변수 경우, 해당 객체에 의해 참조되면, 유지 카운트는이

NSLog(@"Retain count before assign to refer other object %d", [placeHolder retainCount]); 
[self.theSearchBar setPlaceholder:placeHolder]; 
NSLog(@"Retain count after referencing %d", [placeHolder retainCount]); 

그래서, 어떻게이 같은 처리하기 위해 아직? 우리가보다 무슨 짓을 다음

[placeHolder retain]; // retainCount +1 
[self.theSearchBar setPlaceholder:placeHolder]; 
[placeHolder release]; // retainCount -1 

같은

시도 뭔가? 그 후 - - 우리가 로컬 을 해제 그 변수 지금

NSLog(@"Retain count before doing retain %d", [placeHolder retainCount]); 
[placeHolder retain]; // retainCount +1 
NSLog(@"Retain count after retaining it %d", [placeHolder retainCount]); 

그래서 우리가 전에 어떤 객체 (에 의해 참조된다)을 할당하고, 수를 유지를 증가의이 유지 카운트를 살펴 보자.

그게 전부입니다.

+0

위대한 설명. – HotFudgeSunday