2011-09-30 1 views
0

인스턴스 변수가 있다고 가정 해 봅시다. MyObject * test;초기화되고 사용되었는지 ivar 확인

@property(nonatomic, retain) MyObject* test; 

하는 .m

@synthesize test; 

내가 그것을 초기화 할 수도 있고 내가 필요하면 지금 따라 수 있습니다. 필요하지 않으면 초기화시 낭비 할 필요가 없습니다.

질문은 dealloc에서 다음과 같은 확인 및 릴리스를 수행하는 것이 안전합니까?

-(void) dealloc 
{ 
    if (test != nil) 
    { 
    [test release]; 
    } 
{ 

고마워요!

답변

0

완벽하게 괜찮습니다. nil에 대한 테스트를 생략하는 것이 더 관용적입니다.

뒤에서 컴파일러 (일반적으로 *)는 objc_msgSend 또는 그 변형 중 하나를 호출합니다. objc_msgSend (및 변종)을 구현하면 메시지가 nil이라는 프로그래머 오류로 간주되지 않고 잘 정의되어 있다는 의미에서 사용자가 메시지 객체를 nil으로 사용할 수 있습니다. objc_msgSend +의 반환 값은 제로입니다 변종 :

예 : C++ 객체를 반환하는 경우 이것이 당신이 전무을 테스트해야 함을 의미

NSString * string = nil; 
NSString * copy = [string copy]; << copy will be 0/nil 
NSUInteger length = [copy length]; << length will be 0 

- 수신기가 전무 인 경우 생성자가 호출되지 않을 것이다.

* 일반적으로 컴파일러가 메시징과 일부 다른 일반 루틴을 수행하기 위해 호출하는 c 기능이 일부 있음을 의미합니다.

0

그렇게하지 않아도됩니다. 당신이 바르 객체를 오토 릴리즈 할당하면 당신은 단순히이 작업을 수행 할 수 있습니다

self.test = nil; 

편집 :

의 dealloc 함수의 끝에서 [super dealloc]를 호출하는 것을 잊지 마세요

2

예, 안전합니다. 그러나 release을 0으로 보내면 문제가 발생하지 않으므로 확인하지 않아도됩니다.

+0

아무런 문제가 발생하지 않는 모든 메서드를 전송한다고 추가하고 싶습니다. – JustSid

0

안전하지만 표준 연습은 아닙니다. nil 참조에 안전하게 메시지를 보낼 수 있으며 이것은 관용적 인 Objective-C가 작성된 방법의 중요한 부분입니다. ivar를 놓기 만하면됩니다.

- (void)dealloc 
{ 
    [test release]; 
    // ...