2013-05-30 20 views
13

, id döndüren bir yöntem dolaylı bu new veya alloc veya retain, autorelease, init veya self ile başlayan bir örnek yöntemi ile başlayan bir sınıf metodu olduğunda instancetype geri bilinmektedir.Atama/yeni/init yöntemlerinde instancetype kullanılmalı mıdır? <a href="http://clang.llvm.org/docs/LanguageExtensions.html#objective-c-features" rel="noreferrer" title="clang documentation">clang documentation</a> göre

Tutarlılık açısından, instancetype'u açık bir şekilde yeni bir kod olarak vermek için bu yöntemler de yazılmalıdır?

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

Neden mi, neden olmasın veya herhangi bir gerekçeyle ilgili herhangi bir belge var mı? Bu durumda, derleyiciyle tam olarak aynı şekilde yorumlanmış gibi görünüyor.

cevap

18

Aslında gerekli değil çünkü derleyici, (belirtmiş olduğunuz gibi) instancetype'u döndürme yöntemlerini otomatik olarak destekliyor.

Bu automatic inference, llvm belgelerinde belgelenmiştir.

Şahsen? Sözleşmeyi tam olarak tanımladığından ve daha sonra daha kolay geri dönüş yapabilmem için onları her zaman instancetype olarak açıklarım.

+0

Varsayılan, "id" değil, instancetype şeklindedir. Dönen instancetype size daha fazla kontrol sağlar. Kodunuz doğruysa fark yoktur, ancak kimliği döndürürseniz derleyici hataları özleyebilir. – gnasher729

+2

@ gnasher729 instacetype belgelerine bkz. Llvm (http://clang.llvm.org/docs/LanguageExtensions.html). 'instancetype', belirli yöntemler için otomatik olarak çıkarılır ve sonuç olarak, bu durumlarda' instancetype' varsayılan değerdir. – bbum