2012-03-02 5 views
4

C++에서는 생성자에서 과도한 작업을하는 것이 좋습니다. 특히 메모리 할당 후 예외가 발생하면 메모리 누수가 발생할 수 있습니다. 자바에서는 여전히 권장하지 않지만 가비지 컬렉터로 인해 중요성이 적습니다. 목표 C에서 heavy lifting과 관련하여 init 메소드의 입장은 어디에 있습니까? Objetive-C에서객관적인 C 초기화 작업

+2

Apple의 UIView 클래스는 무거운 물건을 viewDidLoad 메서드에 넣으라고 제안하므로 유사한 규칙이 적용된 것으로 판단됩니다. –

+0

현실적으로 말하자면, iPhone 목표 C에서'init' 메소드가 실패하면 어쨌든 응용 프로그램이 죽은 것입니다. 물론 예외가 있지만 사례별로 처리됩니다. 따라서 대부분 "순수한"당신이되고 싶고 앱이 특히 강건해야하는지에 대한 질문입니다. –

+0

@HotLicks 누군가가 init을 버리지 않는 협약을 따르지 않는 한, 어떤 경우에는 실패 할 것입니까? – zode64

답변

3

일반적인 지침은 비용이 많이 드는 경우에 게으른로드를 사용하는 것이 좋습니다. 일반적으로 init은 결과가 필요하지 않으므로 값 비싼 전화를 피해야합니다. 호출자가이 객체를 만든 다음 멀리 던지거나 하나의 값만 봅니다. 필요하지 않은 대량의 데이터 구조를 만들지 않도록하십시오. 이 지침은 성능을 향상시키는 것입니다. 그것은 어렵고 빠른 규칙이 아닙니다.

init을 허용하고 nil을 반환하는 것은 허용되지만 드문 경우입니다. 올바른 접근 방법은 bbum의 대답을 참조하십시오 : Returning nil in the init in Objective C code.

3

는 이니셜 라이저 용 패턴은 초기화 실패하면 nil 반환해야

-(id)init 
{ 
    if (self = [super init]) { 
     // Initialization code here 
    } 
    return self; 
} 

이다. 즉, 초기화 프로그램이 실패하면 누출을 방지하기 위해 self을 올바르게 릴리스해야합니다. 그래서 당신이 그 패턴을 따르는 한 당신은 안전하다고 생각합니다.

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