오른쪽으로 분리하는 방법 등 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]);
그래서 우리가 전에 어떤 객체 (에 의해 참조된다)을 할당하고, 수를 유지를 증가의이 유지 카운트를 살펴 보자.
그게 전부입니다.
위의 코드에서 하나의 명시 적 경로와 하나의 암시 적 경로가 여러 개의 반환 경로를 갖는 것은 바람직하지 않습니다.당신은 [release] 아래로 리턴을 옮겨야합니다. 각각 반복되는 if() 문장이 반복적 인 코드라고 생각하십시오. –
따라하기 힘든 이유는 무엇입니까? 논리가 똑같이 복잡하다면 다음과 같이 보입니다. –
복사 할 장소가 30 개 있고 릴리스 코드 블록을 지나칠 때 유지 관리 할 수 없으며 한 가지 더 추가 할 때 [릴리스]해야하므로 이제 30 개를 업데이트해야합니다. DRY 교장 (자신을 반복하지 마십시오)에 위배됩니다. 반환 값이있는 더 좋은 방법은 논리에서 반환 값을 설정 한 다음 [릴리스] 블록의 단일 지점 직후에 함수의 맨 아래에 해당 값을 반환하는 것입니다. –