2011-05-12 2 views
3

나는 Three20을 연구하기 시작했고 나는 이런 식으로 코드를 작성하려에 대한 TT_RELEASE_SAFELY 까지 지금까지 간단한 질문이 있습니다 :설정 객체 - TT_RELEASE_SAFELY

여기
UILabel *lab = [[UILabel alloc] initWithFrame:rect]; 
[self.view addSubview:lab]; 
[lab release]; 

나는 생각을 메인 풀은 lab의 메모리를 확보해야합니다.

은 이제과 같이 정의된다 TT_RELEASE_SAFELY를 발견 : 당신이 볼 수 있듯이

#define TT_RELEASE_SAFELY(__POINTER) { [__POINTER release]; __POINTER = nil; } 

은 출시 후에는 nil에 개체를 설정합니다.

두 가지 방법의 차이점을 알고 싶습니다. 어느 쪽이 더 좋은지 알고 싶습니다.

감사합니다.

답변

6

Sending a message to nil은 Objective-C에서 유효합니다. 할당 취소 된 객체에 메시지를 보내는 것은 아닙니다.

id obj = [[MyClass alloc] init]; 
[obj release]; 
[obj doSomething]; // Crash!

전무로 메시지를 전송 : 할당 제거 객체에 메시지를 전송

오브젝트 후 변수 닐 할당

id obj = [[MyClass alloc] init]; 
[obj release], obj = nil; 
[obj doSomething]; // Valid

가 해제되어 그것 때문에 논란 뭔가 잘못되었다는 것을 깨닫지 못하게 할 수 있습니다. 외계인의 예를 들어 보자.

[controlCenter dealloc]; 
... 
float timeLeft = [controlCenter timeToWaitBeforeBombDetonation]; 

이 코드는 controlCenter가 할당 취소 되었기 때문에 충돌합니다. 결과적으로이 결함은 조기에 발견되고 해결 될 것입니다.

[controlCenter dealloc], controlCenter = nil; 
... 
float timeLeft = [controlCenter timeToWaitBeforeBombDetonation]; 

이 코드는 controlCenter가 nil 인 경우에도 유효한 대기 시간 인 것으로 보이는 timeLeft에 0.0을 할당합니다.


은 당신이 목표 - C 응용 프로그램을 작성하는 경우 때문에, 당신은 아마 파괴 도시에 비해 충돌을 피함으로써 사용자의 만족도를 유지에 더 관심을, 에누리 위를 가져 가라. 후자가 걱정된다면 아마 Ada와 같은 유형 안전 언어를 사용해야합니다.

+0

나는 그렇게 생각하며, 어떤 종류의 모범 사례이다! – scorpiozj

+0

"유효"하면 "이 특정 시점에서 충돌하지 않을 것"이라고 가정합니다.이름에서 알 수 있듯이 "무언가를하지"않을 것입니다. 대신에 [obj wontDoAnything];가 있어야합니다. –

+0

@Sedate Alien : 호출되지 않는 메소드 측면에서는 아무 것도하지 않지만 사용하도록 선택하면 유효한 반환 값 (0, NO 등)을 제공합니다. – titaniumdecoy

0

유일한 차이점은 TT_RELEASE_SAFELY가 릴리스 후에 포인터를 nil로 설정한다는 것이므로 릴리스 이후에는 참조가 사용되지 않습니다. 패턴은 따라야 할 좋은 패턴이고 TT_RELEASE_SAFELY 매크로는 구현하기가 더 쉽습니다.

+0

고마워요! – scorpiozj

1

"안전한 릴리스"의 변형을 사용하는 것이 명백하게 입니다. 아이디어입니다.

nil에게 전달 된 메시지는 경고를 발생시키지 않으므로 응용 프로그램은 조용하고 신비한 방식으로 실패합니다. 참고 문헌을 생략하고 NSZombieEnabled의 모든 정보를 활용하는 것이 좋습니다.

+2

또는 ....'#define TT_RELEASE_UNSAFELY (__ POINTER) {[__POINTER release]]; __POINTER = (id) 0x42; }' – bbum

+0

@bbum : 그게 효과가 있습니다. :) –

+0

사용하기 전에 객체가 nil인지 여부를 확인할 수 있다고 생각합니다. – scorpiozj

관련 문제