2013-10-10 24 views
9

instancetype değerini init dönüş değeri olarak kullanın ve ilgili yöntemlerin yapılması önerilir, en son clang features numaralı makaleye bakın. Bununla birlikte, en iyi uygulama nedir w.r.t. copyWithZone:'un NSCopying protokolündeki dönüş değeri (önceki en iyi uygulamalar için bkz. this thread)? Sınıfın clang makalesindeki yöntemlerin adlandırma şemasından çıkarılmasıyla ilgili kurallardan bahsedilmiyor, ancak neden alloc yönteminin döndürme değerinden farklı olması gerektiğini anlamıyorum.Insetcetype, Objective-C'de bir kopyanın dönüş tipi olarak mı kullanılıyor?

Tür çıkarımı copy -methods için çalışmıyor mu? Hâlâ instancetype ya da gerçekte geri döndüğümüz sınıf tipine dönelim mi?

cevap

15

instancetype'u KULLANMAMALIDIR. Buradaki bariz durum, immutable/mutable distinction'tır - NSMutableString'un copy'u NSString'u döndürür, bu da immutable olarak davranmalısınız. Bu durumda API, alıcıyla aynı türde bir örnek döndürmez. Diğer bir sebep ise, Josh Caswell'in belirttiği gibi (+1), beyannamenin imzasını eşleştirmenizdir.

Elbette, kendi protokolünüzü istediğiniz semantik ve imzayla bildirmekten alıkoyan bir şey yoktur.

4

copyWithZone: bildirmiyorsunuz; protokol tarafından zaten açıklanmış ve eğer sınıfınız protokolle uyumlu olduğunu söylüyorsa, o zaman mevcut bildirimi de kabul eder. Bu beyan, dönüş türü olarak id kullanır.

Yöntemi uygularken bir dönüş türü yazmak zorundasınız elbette, ancak derleyici, tür denetimi yaparken tanımı değil, bildirimi kullanıyor. Bildiğim kadarıyla, instancetype, id * ile "uyumlu" dır, böylece tanımınızda bunu yazabilirdiniz, fakat kesinlikle konuştuğumda, bildirimle tam olarak aynı türü kullanmak en iyi olacağını düşünüyorum.

Bu nedenle, id'u kullanın.


* yani., Clang yaklaşık copyWithZone: onun dönüş türü olarak instancetype ile tanımlanan şikayet etmiyor.