Saya telah melihat dalam beberapa contoh iPhone bahwa atribut telah menggunakan garis bawah _ di depan variabel. Adakah yang tahu apa artinya ini? Atau bagaimana cara kerjanya?
File antarmuka yang saya gunakan terlihat seperti:
@interface MissionCell : UITableViewCell {
Mission *_mission;
UILabel *_missionName;
}
@property (nonatomic, retain) UILabel *missionName;
- (Mission *)mission;
Saya tidak yakin persis apa yang dilakukan di atas tetapi ketika saya mencoba menetapkan nama misi seperti:
aMission.missionName = missionName;
Saya mendapatkan kesalahan:
meminta anggota 'missionName' dalam sesuatu yang bukan struktur atau kesatuan
property
dalam file .h dan pada file .m saya mengaksesnya menggunakanself
seperti ituself.someProperty
,. Apakah ini cara yang benar? Atau haruskah saya menggunakan ivars dalam kode?Ini hanya sebuah konvensi untuk keterbacaan, tidak melakukan sesuatu yang khusus untuk kompiler. Anda akan melihat orang menggunakannya pada variabel instance pribadi dan nama metode. Apple sebenarnya merekomendasikan untuk tidak menggunakan garis bawah (jika Anda tidak berhati-hati Anda bisa menimpa sesuatu di superclass Anda), tetapi Anda tidak boleh merasa tidak enak mengabaikan saran itu. :)
sumber
Satu-satunya tujuan berguna yang telah saya lihat adalah untuk membedakan antara variabel lokal dan variabel anggota seperti yang disebutkan di atas, tetapi itu bukan konvensi yang diperlukan. Ketika dipasangkan dengan @property, itu meningkatkan verbositas dari pernyataan synthesize -
@synthesize missionName = _missionName;
, dan jelek di mana-mana.Alih-alih menggunakan garis bawah, cukup gunakan nama variabel deskriptif dalam metode yang tidak bertentangan. Ketika mereka harus konflik, nama variabel dalam metode harus menderita garis bawah, bukan variabel anggota yang dapat digunakan oleh beberapa metode . Satu-satunya tempat umum ini berguna adalah dalam setter atau metode init. Selain itu, ini akan membuat pernyataan @synthesize lebih ringkas.
Sunting: Dengan fitur kompiler terbaru sintesis otomatis, saya sekarang menggunakan garis bawah untuk ivar (pada kesempatan yang jarang saya perlu menggunakan ivar untuk mencocokkan apa yang sintesis otomatis lakukan.
sumber
Itu tidak benar-benar berarti apa-apa, itu hanya konvensi yang digunakan beberapa orang untuk membedakan variabel anggota dari variabel lokal.
Sedangkan untuk kesalahan, sepertinya aMission memiliki tipe yang salah. Apa itu deklarasi?
sumber
Ini hanya untuk konvensi penamaan properti sintesis.
Ketika Anda mensintesis variabel dalam file .m, Xcode akan secara otomatis memberikan Anda kecerdasan _variable.
sumber
Memiliki garis bawah tidak hanya memungkinkan untuk menyelesaikan ivar Anda tanpa menggunakan self.member sintaks tetapi juga membuat kode Anda lebih mudah dibaca karena Anda tahu kapan suatu variabel adalah ivar (karena awalan garis bawahnya) atau argumen anggota (tanpa garis bawah) ).
Contoh:
sumber
self.image
, yang mengakses properti. Satu-satunya waktu Anda harus mengakses variabel instan_image
,, secara langsung adalah dalaminit
metode dandealloc
metode, saat memanggil metode lain mungkin berisiko (karena objek setengah diinisialisasi atau setengah-dialokasikan).Ini tampaknya menjadi item "master" untuk pertanyaan tentang self.variableName vs _variablename. Apa yang mendorong saya untuk loop adalah bahwa dalam. H, saya punya:
Ini mengarah ke self.variableName dan _variableName menjadi dua variabel berbeda dalam .m. Yang saya butuhkan adalah:
Kemudian, dalam class '.m, self.variableName dan _variableName setara.
Yang saya masih belum jelas adalah mengapa banyak contoh masih berfungsi, bahkan sulit ini tidak dilakukan.
sinar
sumber
alih-alih menggarisbawahi Anda dapat menggunakan nama self.variable atau Anda dapat mensintesis variabel untuk menggunakan variabel atau outlet tanpa menggarisbawahi.
sumber
Hilang dari jawaban lain adalah bahwa menggunakan
_variable
mencegah Anda mengetik tanpa sadarvariable
dan mengakses ivar daripada properti (mungkin dimaksudkan).Kompiler akan memaksa Anda untuk menggunakan salah satu
self.variable
atau_variable
. Menggunakan garis bawah membuat tidak mungkin untuk mengetikvariable
, yang mengurangi kesalahan programmer.sumber