Saya telah melihat potongan kode berikut:
//example.h
MKMapView * mapView1;
@property (nonatomic, retain) MKMapView * mapView;
//example.m
@synthesize mapView = mapView1
Apa hubungan antara mapView
dan mapView1
? Apakah itu membuat set
dan get
metode untuk mapView1
?
iphone
objective-c
Hoang Duy Nam
sumber
sumber
Jawaban:
Dalam contoh Anda,
mapView1
adalah variabel instan (ivar), sepotong penyimpanan memori yang dimiliki oleh instance kelas yang didefinisikan dalamexample.h
danexample.m
.mapView
adalah nama sebuah properti . Properti adalah atribut dari sebuah objek yang dapat membaca atau diatur dengan menggunakan notasi dot:myObject.mapView
. Sebuah properti tidak memiliki harus didasarkan pada sebuah Ivar, tapi kebanyakan properti yang. The@property
deklarasi hanya memberitahu dunia bahwa ada sifat yang disebutmapView
.@synthesize mapView = mapView1;
Baris ini memberi tahu kompiler untuk membuat setter dan pengambil
mapView
, dan mereka harus menggunakan ivar yang disebutmapView1
. Tanpa= mapView1
bagian itu, kompiler akan menganggap bahwa properti dan ivar memiliki nama yang sama. (Dalam hal ini, itu akan menghasilkan kesalahan kompiler, karena tidak ada ivar yang dipanggilmapView
.)Hasil
@synthesize
pernyataan ini mirip dengan jika Anda telah menambahkan kode ini sendiri:Jika Anda menambahkan kode itu sendiri ke kelas, Anda dapat mengganti
@synthesize
pernyataan itu dengan@dynamic mapView;
Hal utama adalah memiliki perbedaan konseptual yang sangat jelas antara ivar dan properti. Mereka benar-benar dua konsep yang sangat berbeda.
sumber
@synthesize
menciptakan pengambil dan penyetel untuk variabel.Ini memungkinkan Anda menentukan beberapa atribut untuk variabel Anda dan ketika Anda
@synthesize
properti itu ke variabel Anda menghasilkan pengambil dan penyetel untuk variabel.Nama properti bisa sama dengan nama variabel. Kadang-kadang orang ingin itu berbeda sehingga menggunakannya di
init
ataudealloc
atau ketika parameter dilewatkan dengan nama variabel yang sama.sumber
Dari dokumentasi :
sumber
Karena saya baru saja mengalami masalah ini ketika mengedit kode lama saya ingin membuat catatan tambahan untuk jawaban yang ada yang perlu diperhatikan.
Bahkan dengan versi kompiler yang lebih baru terkadang membuat perbedaan jika Anda menghilangkan
@synthesize propertyName
atau tidak .Jika Anda mendeklarasikan variabel instan tanpa garis bawah saat masih mensintesisnya, seperti:
Tajuk:
Penerapan:
self.someInt
akan mengakses variabel yang sama dengansomeInt
. Tidak menggunakan garis bawah terkemuka untuk ivars tidak mengikuti konvensi penamaan tetapi saya hanya datang ke situasi di mana saya harus membaca dan memodifikasi kode tersebut.Tetapi jika Anda sekarang berpikir "Hei, @synthesize tidak penting lagi karena kami menggunakan kompiler yang lebih baru" Anda salah! Kelas Anda kemudian akan menghasilkan memiliki dua ivar , yaitu
someInt
ditambah_someInt
variabel autogenerated . Dengan demikianself.someInt
dansomeInt
tidak akan membahas variabel yang sama lagi. Jika Anda tidak mengharapkan perilaku seperti yang saya lakukan ini mungkin membuat Anda sakit kepala untuk mengetahuinya.sumber
@synchronize
adalah arahan untuk bagaimana menyinkronkan utas saat mengakses properti dan@synthesize
untuk mengikat properti ke variabel instan melalui getter dan setter.Autosynthesized property 'someInt' will use synthesized instance variable '_someInt', not existing instance variable 'someInt'
. (Saya tidak tahu di versi xcode mana peringatan ini ditambahkan.)Per dokumentasi Apple @Synthesize hanya digunakan untuk mengubah nama variabel instan. Sebagai contoh
Sekarang di kelas Anda tidak dapat menggunakan
_str
karena baris di atas telah mengubah nama variabel instance menjadistr2
@property
memungkinkan objek untuk digunakan oleh objek di kelas lain, atau dengan kata lain membuat objek publik.sumber
Saat Anda membuat properti di @interface, properti itu akan secara otomatis kembali oleh variabel instan bernama _propertyName. Jadi ketika Anda membuat properti bernama firstName, kompiler di belakang layar akan membuat variabel instan bernama _firstName secara default. Compiler juga akan membuat metode pengambil dan penyetel untuk Anda (mis. FirstName, setFirstName).
Sekarang ketika Anda mensintesis properti dengan @sintesize firstName, Anda cukup memberi tahu kompilator ganti nama variabel instan saya (_firstName) dengan firstName. Jika Anda ingin mengganti nama variabel instance yang dicadangkan Anda dengan nama yang berbeda, Anda dapat menetapkan nama yang berbeda saat mensintesiskan nama properti (yaitu @sintesize firstName = myFirstName), dengan melakukan ini properti Anda didukung oleh variabel instance bernama myFirstname.
Jadi, singkatnya, sebagian besar waktu @synthesize digunakan untuk mengubah nama variabel instan Anda didukung oleh properti Anda.
sumber
Lihat dokumen apel
Pada dasarnya synthesize menciptakan metode setMapView dan mapView yang mengatur dan mendapatkan mapView1
sumber
Ini menciptakan pengambil dan penyetel untuk objek Anda. Anda dapat mengakses dengan sesuatu seperti ini:
atau
mapView1 adalah nama dari ivar di kelas, mapView adalah nama untuk metode pengambil / penyetel.
sumber