2010-03-18 3 views
11

init 내에서 오류가 발생하면 항상 self를 릴리스해야합니까? 아니면 인스턴스 변수를 먼저 초기화 한 경우에만해야합니까?실패한 초기화 메소드에 대해 항상 자체를 릴리스해야합니까?

다른 말로하면이 패턴이 유효합니까? init 메소드 내부에서 자체를 해제해서는 안되는 시간이 있습니까? 아니면 제어 흐름이 init에 들어가면 self는 최소한 1의 보유 수를 유지한다고 가정해야합니까?

- (id)init 
{ 
if ((self = [super init]) == nil) 
{ 
    [self release]; 
    return nil; 
} 

//do some init stuff 
if (somethingFailed) 
{ 
    [self release]; 
    return nil; 
} 
return self; 
} 

답변

17

초기화 방법에 필요한 검사가 실패하면 예 : self을 릴리스해야합니다. 그러나 [super init]nil을 반환하면 selfself으로 릴리스를 보내는 것이 의미가 없으므로 selfnil입니다. 이것은 실제로 애플이 눈살을 찌푸리게합니다.

장애가 발생한 시점에서만 [self release]으로 전화해야합니다. 수퍼 클래스 이니셜 라이저 호출에서 nil이 반환되면 release도 호출하면 안됩니다.

예 :

- (id)init 
{ 
    self = [super init]; 
    if(self) { 
     // do some init stuff 

     if (somethingFailed) 
     { 
      [self release] 
      self = nil; 
     } 
    } 

    return self; 
} 

는 또한 Handling Initialization Failure

+0

아에 맥 개발자 센터 문서를 참조하십시오, 지금 당신이 그것을 지적 너무 명백한 것 같다. alloc/copy/new 등을 호출하지 않은 객체에 대한 릴리즈를 호출하기 때문에 조금 던져 버렸습니다. – leo

+1

그래, 기본 원칙은 초기화에서 처음 오류가 발생하면 init이 호출 된 할당 된 공간을 해제 한 다음 nil을 반환해야한다는 것입니다. 다른 사람들은 아무 것도 얻지 못하기 때문에 메모리를 공개 할 방법이 없기 때문에 메모리 누수를 피하기 위해 왜 스스로를 release라고해야 하는가? –

+0

감사합니다. – leo

관련 문제