Dugaan saya adalah bahwa versi kompiler yang Anda gunakan mengikuti aturan manajemen memori untuk properti yang dideklarasikan juga - lebih khusus, untuk pengakses properti yang dideklarasikan:
Anda mengambil kepemilikan atas suatu objek jika Anda membuatnya menggunakan metode yang namanya dimulai dengan "alokasi", "baru", "salin", atau "mutableCopy".
Properti bernama newTitle
, ketika disintesis, menghasilkan metode yang disebut -newTitle
, maka peringatan / kesalahan. -newTitle
seharusnya menjadi metode pengambil untuk newTitle
properti, namun konvensi penamaan menyatakan bahwa metode yang namanya dimulai dengan new
mengembalikan objek yang dimiliki oleh penelepon, yang bukan kasus metode pengambil.
Anda dapat menyelesaikan ini dengan:
Mengganti nama properti itu:
@property (strong, nonatomic) NSString *theNewTitle;
Menyimpan nama properti dan menentukan nama pengambil yang tidak dimulai dengan salah satu awalan nama metode khusus:
@property (strong, nonatomic, getter=theNewTitle) NSString *newTitle;
Menjaga nama properti dan nama pengambil, dan memberi tahu kompiler bahwa, meskipun nama pengambil dimulai new
, itu milik none
keluarga metode yang bertentangan dengan new
keluarga metode:
#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
Perhatikan bahwa meskipun solusi ini memungkinkan Anda untuk menyimpan newTitle
karena nama properti dan nama pengambil, memiliki metode yang dipanggil -newTitle
yang tidak mengembalikan objek yang dimiliki oleh penelepon dapat membingungkan bagi orang lain yang membaca kode Anda.
Sebagai catatan, Apple telah menerbitkan Transitioning to ARC Release Notes , di mana mereka menyatakan:
Anda tidak dapat memberikan properti nama yang dimulai dengan new
atau copy
.
Mereka sudah diberitahu bahwa pernyataan mereka tidak cukup akurat: pelakunya adalah nama metode pengambil, bukan nama properti.
Sunting 17 Jan 2015: Saya baru saja melihat komit terbaru untuk Dentang yang menyarankan opsi 3 di atas (menggunakan objc_method_family(none)
), untuk memperbaikinya, untuk kasus umum di mana nama properti cocok dengan salah satu awalan keluarga metode khusus. Xcode kemungkinan akan memasukkan perubahan ini pada akhirnya.