Saat ini saya menggunakan iOS 5 SDK yang mencoba mengembangkan aplikasi saya. Saya mencoba membuat properti NSString, dan kemudian mensintesisnya dalam file .m (saya telah melakukan ini sebelumnya tanpa masalah). Sekarang, saya menemukan ini: "Masalah Semantik: Pembuat properti yang disintesis mengikuti konvensi penamaan Kakao untuk mengembalikan objek 'milik'."
Ini adalah kode saya: .h
@interface ViewController : UIViewController {
NSString *newTitle;
}
@property (strong, nonatomic) NSString *newTitle;
.m
@synthesize newTitle;
Adakah yang tahu bagaimana saya bisa memperbaikinya? Terima kasih!!
Jawaban:
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:
Properti bernama
newTitle
, ketika disintesis, menghasilkan metode yang disebut-newTitle
, maka peringatan / kesalahan.-newTitle
seharusnya menjadi metode pengambil untuknewTitle
properti, namun konvensi penamaan menyatakan bahwa metode yang namanya dimulai dengannew
mengembalikan objek yang dimiliki oleh penelepon, yang bukan kasus metode pengambil.Anda dapat menyelesaikan ini dengan:
Mengganti nama properti itu:
Menyimpan nama properti dan menentukan nama pengambil yang tidak dimulai dengan salah satu awalan nama metode khusus:
Menjaga nama properti dan nama pengambil, dan memberi tahu kompiler bahwa, meskipun nama pengambil dimulai
new
, itu miliknone
keluarga metode yang bertentangan dengannew
keluarga metode: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:
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.sumber
NS_RETURNS_NOT_RETAINED
apa yang Anda butuhkan juga.Nama Objek Tidak Dapat Diterima
Nama Objek yang Dapat Diterima
#arc # disintesis secara otomatis # xcode-4.6.1
** EDIT **
Tampaknya Anda juga tidak dapat menggunakan mutableCopy .
sumber
Nama anggota yang dimulai dengan yang baru itulah yang memicu peringatan. Ubah nama menjadi editedTitle dan peringatan akan hilang. Saya tidak dapat menemukan dokumentasi yang mengonfirmasi hal ini, tetapi melalui pengujian dapat menentukan bahwa variabel anggota yang dimulai dengan 'baru' memperburuk kompiler.
sumber
ARC tidak mengizinkan untuk menggunakan "Baru ...." dalam nama properti. tetapi Anda dapat menggunakan "newTitle" dengan mengubah nama pengambil.
sumber
Sepertinya Bavarious tidak menyarankan apa yang ingin Anda lakukan. Yang ingin Anda lakukan adalah mendeklarasikan variabel instan
NewTitle
dan kemudian mensintesis properti. Kami dulu harus mendeklarasikan variabel instance dan properti. Tidak lagi.Sekarang, saya percaya cara yang tepat untuk melakukan ini adalah sebagai berikut:
.h
.m
Variabel instance untuk properti
newTitle
disintesis. Anda tidak ingin variabel instan Anda sama dengan properti Anda - terlalu mudah untuk membuat kesalahan .Lihat Contoh: Mendeklarasikan Properti dan Mensintesis Accessors
sumber
NS_RETURNS_NOT_RETAINED
adalah apa yang kamu butuhkan.Di CoreData jika Anda menggunakan atribut "new ..." (kompilasi secara normal) itu akan crash secara acak dengan pengecualian "akses buruk".
Tidak ada log mogok dan garis yang ditampilkan dengan "Semua Pengecualian Breakpoint" tidak akan membantu Anda sama sekali.
sumber
Menulis setter secara manual dengan nama yang sama dengan properti menghapus peringatan ini.
sumber
Selain masalah bahwa Anda harus / tidak dapat menggunakan "baru" di depan Anda nama properti, katakan satu hal lagi: Cobalah untuk menghindari "baru" di depan nama secara umum. "Baru" tergantung pada waktu. Saat ini baru untuk Anda, tetapi beberapa waktu kemudian Anda mungkin ingin menerapkan sesuatu yang baru lagi. Jadi menggunakan "baru" dalam nama selalu buruk. Cobalah untuk berpikir seperti ini: Di dunia pemrograman, "baru" selalu menciptakan sesuatu: contoh baru dari sesuatu.
Dalam kasus Anda ketika Anda ingin menetapkan judul yang berbeda maka beri nama properti Anda saat ini titleReplacement.
Satu hal lagi: Cobalah untuk menyebutkan fungsi dan metode dengan kata kerja terlebih dahulu, seperti setSomething atau getSomething. Tetapi pada properti coba beri nama objek terlebih dahulu, seperti heightMinimum, heightMaximum, dll. -> saat Anda menggunakan inspektur saat Anda membuat kode, Anda selalu mencari objek. Cobalah. ;-)
sumber
NS_RETURNS_NOT_RETAINED
digunakan untuk memecahkan masalah penamaan.Kita dapat menemukan definisinya sebagai berikut,
Lampirkan detail lebih lanjut di sini.
sumber
coba ini:-
sumber