Saya baru-baru ini mencoba untuk mengkompilasi proyek Xcode yang lebih lama (yang digunakan untuk mengkompilasi dengan baik), dan sekarang saya melihat banyak kesalahan dari formulir ini:
error: writable atomic property 'someProperty' cannot pair a synthesized setter/getter with a user defined setter/getter
Pola kode yang menyebabkan kesalahan ini selalu terlihat seperti ini:
// Interface:
@property (retain) NSObject * someProperty;
// Implementation:
@synthesize someProperty; // to provide the getter
- (void)setSomeProperty:(NSObject *)newValue
{
//..
}
Saya bisa melihat mengapa kesalahan ini terjadi. Saya memberitahu kompiler untuk mensintesis aksesor properti saya (baik pengambil dan penyetel), dan kemudian segera saya menimpa penyetel secara manual. Kode itu selalu berbau sedikit.
Jadi, apa cara yang tepat untuk melakukan ini? Jika saya menggunakan @dynamic
alih-alih @synthesize
, saya harus menulis getter juga. Apakah itu satu-satunya jalan?
atomic
properti? Dalam hal sifat atom, mungkin merupakan ide yang baik untuk menjaga pasangan pengambil / penyetel sinkron sehubungan dengan strategi penguncian. Ini sulit jika satu bagian disintesis sementara yang lain adalah kode kustom.Jawaban:
Saya memiliki masalah yang sama dan setelah melakukan sedikit riset, inilah kesimpulan saya tentang masalah ini:
Kompiler memperingatkan Anda tentang
@property
yang Anda nyatakan sebagai atom (yaitu dengan menghilangkannonatomic
kata kunci), namun Anda memberikan implementasi yang tidak lengkap tentang bagaimana menyinkronkan akses ke properti itu.Untuk menghilangkan peringatan itu:
Jika Anda mendeklarasikan
@property
sebagai atom maka lakukan salah satu dari yang berikut:@dynamic
atau;@synthesize
dan simpan setter dan pengambil yang disintesis atau;Jika Anda mendeklarasikan
@property
dengan(nonatomic)
maka Anda dapat mencampur implementasi getter dan setter manual dan disintesis.Pembaruan: Catatan tentang Sintesis Otomatis Properti
Pada LLVM 4.0, CLang menyediakan sintesis otomatis untuk properti yang dinyatakan tidak
@dynamic
. Secara default, bahkan jika Anda mengabaikannya@synthesize
, kompiler akan menyediakan metode pengambil dan penyetel untuk Anda. Namun, aturan untuk sifat atom masih sama: Entah membiarkan compiler memberikan baik pengambil dan setter, OR menerapkannya baik sendiri!sumber
Anda perlu menerapkan rajin dan giat. Contoh:
sumber
Pertanyaan ini, di antara hit top lain yang Anda dapatkan dari mencari "properti kustom objektif C", tidak diperbarui dengan informasi tentang "setter =" atau "getter =".
Jadi, untuk memberikan informasi lebih lanjut tentang pertanyaan ini:
Anda dapat menyediakan panggilan properti dengan metode Anda sendiri dengan menulis
Perhatikan titik dua untuk metode penyetel yang disediakan.
Referensi dokumentasi Apple
EDIT: Saya tidak yakin bagaimana perubahan baru pada properti Objective-C (mereka jauh lebih cerdas sekarang) mengubah jawaban untuk pertanyaan ini. Mungkin itu semua harus ditandai sebagai ketinggalan zaman.
sumber
Bagi orang lain yang mendapatkan kesalahan ini bukan karena alasan OP dijelaskan, Anda mungkin memiliki masalah yang sama dengan saya:
Anda memiliki @ properti dengan nama yang sama dengan metode - ().
Sesuatu seperti ini:
sumber