2013-05-30 13 views
13

Secondo il clang documentation, un metodo che restituisce id è implicitamente noto per tornare instancetype quando si tratta di un metodo di classe che inizia con new o alloc, o un metodo di istanza che inizia con retain, autorelease, init o self.Dovrebbe essere usato instancetype sui metodi alloc/new/init?

Per motivi di coerenza, questi metodi devono essere scritti anche per restituire esplicitamente instancetype nel nuovo codice?

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

C'è qualche documentazione sul perché o perché no o su un qualsiasi ragionamento? Sembra che in questo caso sia interpretato esattamente allo stesso modo del compilatore.

risposta

18

In realtà non è necessario perché il compilatore promuove automaticamente tali metodi per restituire instancetype, in modo efficace (come dichiarato).

Questo automatic inference è documentato nella documentazione di llvm.

Personalmente? Li dichiaro sempre come instancetype esplicitamente perché descrive esattamente il contratto e rende più facile il refactoring in seguito.

+0

Il valore predefinito è "id", non instancetype. Restituendo instancetype ti dà più controllo di tipo. Non c'è differenza se il tuo codice è corretto, ma il compilatore potrebbe perdere gli errori se restituisci id. – gnasher729

+2

@ gnasher729 Vedere la documentazione di instancetype in llvm (http://clang.llvm.org/docs/LanguageExtensions.html). 'instancetype' viene automaticamente dedotto per determinati metodi e, di conseguenza,' instancetype' è il valore predefinito in questi casi. – bbum

Problemi correlati