2011-07-27 5 views
3

내 사용자 정의 초기화 프로그램이 실패하면 nil을 리턴한다고 가정합니다. 내 이니셜 라이저에서 할당 한 메모리를 정리하는 컨벤션은 무엇입니까? dealloc에서 정리 될 것으로 기대하고 있었습니까?사용자 정의 init 실패시 메모리 정리 방법

는 여기에 인위적인 예입니다

- (id)init 
{ 
    if ((self = [super init])) { 
     instanceVar1 = [[NSString alloc] initWithString:@"blah"]; 
     if (bad_thing_oh_noes) { 
      return nil; 
     } 
    } 
    return self; 
} 

- (void)dealloc 
{ 
    [instanceVar1 release]; 

    [super dealloc]; 
} 

내가 할당이 배열 등을 포함하는 복잡한 객체를 직렬화 복원 될 전에 내가 효율적으로 모든 오류 상태를 확인할 수 없습니다 더 현실적인 상황.

어쨌든 nil을 반환하기 전에 할당 된 메모리를 정리해야합니까? nil을 반환하기 전에 자기 자신에게 dealloc 메시지를 보내거나이 모든 것이 마술처럼 관리되고 있습니까?

답변

2

이니셜 라이저 중에 오류가 발생하면 selfrelease을 호출하고 nil을 반환해야합니다.

if (bad_thing_oh_noes) { 
    [self release]; 
    return nil; 
} 

또한, 당신은 부분적으로 초기화 된 객체에 dealloc를 안전하게 호출 할 수 있는지 확인해야합니다.

오류가 발생했을 때 release으로 전화해야합니다. 수퍼 클래스의 초기화 프로그램에서 nil을 얻은 경우 release으로 호출하면 안됩니다.

일반적으로 초기화 실패시 예외를 throw해서는 안됩니다.

Handling Initialization Failure에서 예 :

- (id)initWithURL:(NSURL *)aURL error:(NSError **)errorPtr { 

    self = [super init]; 
    if (self) { 

     NSData *data = [[NSData alloc] initWithContentsOfURL:aURL 
             options:NSUncachedRead error:errorPtr]; 

     if (data == nil) { 
      // In this case the error object is created in the NSData initializer 
      [self release]; 
      return nil; 
     } 
     // implementation continues... 
+0

바보 나, 나는 그 문서를 읽을 수 있지만 내 질문에 대답 부분을 놓쳤다 생각했다! 이 문제를 해결해 주셔서 감사합니다. :-) – Sandy

+0

@Sandy 당신은 환영합니다 :) – albertamg

관련 문제