2013-05-30 3 views
13

, id을 반환하는 방법은 암시 적으로는 new 또는 alloc, 또는 retain, autorelease, init, 또는 self로 시작하는 인스턴스 메소드로 시작하는 클래스 메소드 인 경우 instancetype를 반환하는 것으로 알려져있다.instancetype을 alloc/new/init 메소드에서 사용해야합니까? <a href="http://clang.llvm.org/docs/LanguageExtensions.html#objective-c-features" rel="noreferrer" title="clang documentation">clang documentation</a>에 따르면

일관성을 유지하기 위해 새 코드에서 instancetype을 명시 적으로 반환하도록 작성해야합니까?

- (instancetype)init { 
    self = [super init]; 
    if (self) { 
     // perform initialization 
    } 
    return self; 
} 

이유가 무엇인지, 왜 그렇지 않은지, 추론하는 문서가 있습니까? 이 경우 컴파일러와 완전히 똑같은 것으로 해석됩니다.

답변

18

컴파일러가 자동으로 이러한 메서드를 instancetype을 반환하도록 (실제로 명시한대로) 승격시키기 때문에 실제로 필요하지 않습니다.

automatic inference은 llvm 설명서에 설명되어 있습니다.

개인적으로? 정확히 계약을 설명하고 나중에 더 쉽게 리팩토링을하기 때문에 항상 명시 적으로 instancetype으로 선언합니다.

+0

기본값은 "id"이며 instancetype은 아닙니다. instancetype을 반환하면 더 많은 유형을 검사 할 수 있습니다. 코드가 정확하다면 차이가 없지만, id를 반환하면 컴파일러가 실수를 놓칠 수 있습니다. – gnasher729

+2

@ gnasher729 llvm (http://clang.llvm.org/docs/LanguageExtensions.html)의 instancetype 설명서를 참조하십시오. 'instancetype'은 특정 메소드에 대해 자동으로 유추되며, 결과적으로'instancetype'가 기본값으로 사용됩니다. – bbum