Tahminimce kullandığınız derleyici sürümü , bildirilen özellikler için bellek yönetimi kurallarına da uyuyor - daha spesifik olarak bildirilen özelliklerin erişimcileri için:
Adı “ayır”, “yeni”, “kopya” veya “mutableCopy” ile başlayan bir yöntem kullanarak oluşturursanız, bir nesnenin sahipliğini alırsınız.
Adlandırılmış bir özellik newTitle
, sentezlendiğinde, adı verilen bir yöntem verir -newTitle
, bu nedenle uyarı / hata verir. -newTitle
özelliğinin bir alıcı yöntemi olduğu varsayılır newTitle
, ancak adlandırma kuralları, adı ile başlayan bir yöntemin new
arayan tarafından sahip olunan bir nesneyi döndürdüğünü belirtir (alıcı yöntemi değil).
Bunu şu şekilde çözebilirsiniz:
Bu mülkü yeniden adlandırmak:
@property (strong, nonatomic) NSString *theNewTitle;
Mülk adını tutmak ve özel yöntem adı öneklerinden biriyle başlamayan bir alıcı adı belirtmek:
@property (strong, nonatomic, getter=theNewTitle) NSString *newTitle;
Hem mülk adını hem de alıcı adını tutmak ve derleyiciye, alıcı adı başlasa bile new
, none
yöntem ailesinin aksine yöntem ailesine ait olduğunu söylemek new
:
#ifndef __has_attribute
#define __has_attribute(x) 0 // Compatibility with non-clang compilers
#endif
#if __has_attribute(objc_method_family)
#define BV_OBJC_METHOD_FAMILY_NONE __attribute__((objc_method_family(none)))
#else
#define BV_OBJC_METHOD_FAMILY_NONE
#endif
@interface ViewController : UIViewController
@property (strong, nonatomic) NSString *newTitle;
- (NSString *)newTitle BV_OBJC_METHOD_FAMILY_NONE;
@end
Bu çözüm, newTitle
hem özellik adı hem de alıcı adı olarak kalmanıza izin verse de -newTitle
, arayanın sahip olduğu bir nesneyi döndürmeyen bir yönteme sahip olmanın , kodunuzu okuyan diğer insanlar için kafa karıştırıcı olabileceğini unutmayın.
Kayıt için Apple, ARC Sürüm Notlarına Geçiş'i yayınladı ve yayınladıkları :
Bir özelliğe new
veya ile başlayan bir ad veremezsiniz copy
.
İfadelerinin tam olarak doğru olmadığı konusunda bilgilendirildiler: suçlu, mülk adı değil, alıcı yöntemi adıdır.
Düzenleme 17 Ocak 2015: Clang'a , yeniobjc_method_family(none)
bir özellik adının özel yöntem ailesi öneklerinden biriyle eşleştiği genel durum için, bir düzeltme aracı da dahil olmak üzere yukarıdaki 3. seçeneği öneren kısa bir taahhüt gördüm . Xcode büyük olasılıkla bu değişikliği eninde sonunda dahil edecektir.