Apa perbedaan antara menerapkan @property
dengan @dynamic
atau @synthesize
?
559
Apa perbedaan antara menerapkan @property
dengan @dynamic
atau @synthesize
?
@synthesize akan menghasilkan metode pengambil dan penyetel untuk properti Anda. @dynamic hanya memberitahu kompiler bahwa metode pengambil dan penyetel diimplementasikan bukan oleh kelas itu sendiri tetapi di tempat lain (seperti superclass atau akan disediakan saat runtime).
Penggunaan untuk @dynamic misalnya dengan subkelas NSManagedObject
(CoreData) atau ketika Anda ingin membuat outlet untuk properti yang ditentukan oleh superclass yang tidak didefinisikan sebagai outlet.
@dynamic juga dapat digunakan untuk mendelegasikan tanggung jawab mengimplementasikan accessors. Jika Anda menerapkan accessors sendiri di dalam kelas maka Anda biasanya tidak menggunakan @dynamic.
Kelas super:
@property (nonatomic, retain) NSButton *someButton;
...
@synthesize someButton;
Subkelas:
@property (nonatomic, retain) IBOutlet NSButton *someButton;
...
@dynamic someButton;
NSUnknownKeyException
kesalahan dengan properti dinamis saya ketika saya menghapus@synthesize
baris (Xcode 3.2 memberi saya kesalahan b / c saya tidak punya ivar yang cocok untuk @property saya). Menambahkan@dynamic
memperbaiki masalah - kompilasi dan berjalan dengan baik sekarang. Terima kasih!@property
item yang tidak memiliki@synthesize
atau@dynamic
akan disintesis secara otomatis. Untuk setiap properti, sebuah ivar dengan garis bawah utama, misalnya_propertyName
akan dibuat, bersama dengan pengambil dan penyetel yang sesuai.Lihatlah artikel ini ; di bawah judul "Metode yang disediakan saat runtime":
The
@synthesize
direktif, di sisi lain, menghasilkan metode accessor untuk Anda pada waktu kompilasi (meskipun seperti yang tercantum dalam bagian "Pencampuran disintesis dan Custom Accessors" itu adalah fleksibel dan tidak menghasilkan metode untuk Anda jika salah diimplementasikan).sumber
Seperti yang orang lain katakan, secara umum Anda menggunakan @synthesize untuk membuat kompiler menghasilkan getter dan / atau pengaturan untuk Anda, dan @dynamic jika Anda ingin menulisnya sendiri.
Ada kehalusan lain yang belum disebutkan: @synthesize akan membiarkan Anda memberikan implementasi sendiri, baik dari pengambil atau penyetel. Ini berguna jika Anda hanya ingin mengimplementasikan pengambil untuk beberapa logika tambahan, tetapi biarkan kompiler menghasilkan setter (yang, untuk objek, biasanya sedikit lebih rumit untuk menulis sendiri).
Namun, jika Anda menulis implementasi untuk pengakses @ synthesize'd itu masih harus didukung oleh bidang nyata (misalnya, jika Anda menulis
-(int) getFoo();
Anda harus memilikiint foo;
bidang). Jika nilai sedang diproduksi oleh sesuatu yang lain (misalnya dihitung dari bidang lain) maka Anda harus menggunakan @dynamic.sumber
@dynamic
jika Anda akan menulisnya sendiri" Tidak, Anda TIDAK menggunakan dinamis jika Anda menulisnya sendiri.@dynamic
mematikan pemeriksaan kompiler untuk memastikan Anda menerapkannya. Jika Anda menerapkannya sendiri, Anda ingin kompilator memeriksa.@dynamic biasanya digunakan (seperti yang telah dikatakan di atas) ketika sebuah properti sedang dibuat secara dinamis saat runtime. NSManagedObject melakukan ini (mengapa semua propertinya dinamis) - yang menekan beberapa peringatan kompiler.
Untuk gambaran umum yang baik tentang cara membuat properti secara dinamis (tanpa NSManagedObject dan CoreData :, lihat: http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/ocrtDynamicResolution.html#//// apple_ref / doc / uid / TP40008048-CH102-SW1
sumber
di sini adalah contoh @dynamic
sumber
Sesuai dokumentasi:
https://developer.apple.com/library/mac/documentation/cocoa/conceptual/ObjCRuntimeGuide/Articles/ocrtDynamicResolution.html
@dynamic memberi tahu kompiler bahwa metode accessor disediakan saat runtime.
Dengan sedikit penyelidikan saya menemukan bahwa menyediakan metode accessor mengesampingkan direktif @dynamic.
@synthesize memberitahu kompiler untuk membuat pengakses tersebut untuk Anda (pengambil dan penyetel)
@ properti memberitahu kompiler bahwa accessors akan dibuat, dan yang dapat diakses dengan notasi titik atau [pesan objek]
sumber
Satu hal yang ingin ditambahkan adalah bahwa jika properti dideklarasikan sebagai @dynamic tidak akan menempati memori (saya dikonfirmasi dengan instrumen alokasi). Konsekuensinya adalah Anda dapat mendeklarasikan properti dalam kategori kelas.
sumber
Sesuai dokumentasi Apple.
Anda menggunakan
@synthesize
pernyataan di blok implementasi kelas untuk memberi tahu kompiler untuk membuat implementasi yang cocok dengan spesifikasi yang Anda berikan dalam@property
deklarasi.Anda menggunakan
@dynamic
pernyataan untuk memberi tahu kompiler untuk menekan peringatan jika tidak dapat menemukan implementasi metode accessor yang ditentukan oleh@property
deklarasi.Info lebih lanjut:-
https://developer.apple.com/library/ios/documentation/General/Conceptual/DevPedia-CocoaCore/DeclaredProperty.html
sumber