Sebelum Anda tahu tentang atribut @ properti, Anda harus tahu apa gunanya @ properti.
@ properti menawarkan cara untuk mendefinisikan informasi bahwa kelas dimaksudkan untuk merangkum. Jika Anda mendeklarasikan objek / variabel menggunakan @property , maka objek / variabel itu akan dapat diakses oleh kelas lain yang mengimpor kelasnya.
Jika Anda mendeklarasikan objek menggunakan @property di file header, maka Anda harus mensintesisnya menggunakan @synthesize dalam file implementasi. Ini membuat objek KVC sesuai . Secara default, kompiler akan mensintesis metode accessor untuk objek ini.
metode accessor adalah: setter dan pengambil.
Contoh: .h
@interface XYZClass : NSObject
@property (nonatomic, retain) NSString *name;
@end
.m
@implementation XYZClass
@synthesize name;
@end
Sekarang kompiler akan mensintesis metode aksesor untuk nama .
XYZClass *obj=[[XYZClass alloc]init];
NSString *name1=[obj name]; // get 'name'
[obj setName:@"liza"]; // first letter of 'name' becomes capital in setter method
Daftar atribut @property
atomik, nonatomik, simpan, salin, baca saja, baca-tulis, tetapkan, kuat, pengambil = metode, setter = metode, tidak aman_tidakdikirim
atom adalah perilaku default. Jika suatu objek dinyatakan sebagai atom maka itu menjadi thread-safe. Thread-safe berarti, pada suatu waktu hanya satu thread dari instance tertentu dari kelas yang dapat memiliki kontrol atas objek itu.
Jika utas melakukan metode pengambil maka utas lainnya tidak dapat melakukan metode setter pada objek itu. Itu lambat.
@property NSString *name; //by default atomic`
@property (atomic)NSString *name; // explicitly declared atomic`
- nonatomik tidak aman untuk benang. Anda dapat menggunakan atribut properti nonatomik untuk menentukan bahwa pengakses yang disintesis cukup menetapkan atau mengembalikan nilai secara langsung, tanpa jaminan tentang apa yang terjadi jika nilai yang sama diakses secara bersamaan dari utas yang berbeda.
Karena alasan ini, lebih cepat mengakses properti nonatomik daripada properti atomik.
@property (nonatomic)NSString *name;
- retain diperlukan saat atribut adalah penunjuk ke objek.
Metode setter akan meningkatkan jumlah retensi objek, sehingga akan menempati memori dalam kumpulan autorelease.
@property (retain)NSString *name;
- copy Jika Anda menggunakan copy, Anda tidak bisa menggunakan retain. Menggunakan copy instance dari kelas akan berisi salinannya sendiri.
Bahkan jika string yang dapat diubah diatur dan kemudian diubah, instance menangkap nilai apa pun yang dimilikinya pada saat itu ditetapkan. Tidak ada metode setter dan pengambil yang akan disintesis.
@property (copy) NSString *name;
sekarang,
NSMutableString *nameString = [NSMutableString stringWithString:@"Liza"];
xyzObj.name = nameString;
[nameString appendString:@"Pizza"];
nama akan tetap tidak terpengaruh.
- readonly Jika Anda tidak ingin mengizinkan properti diubah melalui metode setter, Anda dapat mendeklarasikan properti readonly.
Compiler akan menghasilkan pengambil, tetapi bukan penyetel.
@property (readonly) NSString *name;
- readwrite adalah perilaku default. Anda tidak perlu menentukan atribut readwrite secara eksplisit.
Ini kebalikan dari readonly.
@property (readwrite) NSString *name;
- assign akan menghasilkan setter yang memberikan nilai ke variabel instan secara langsung, daripada menyalin atau mempertahankannya. Ini terbaik untuk tipe primitif seperti NSInteger dan CGFloat, atau objek yang tidak Anda miliki secara langsung, seperti delegasi.
Ingatlah, simpan dan tetapkan pada dasarnya bisa dipertukarkan saat pengumpulan sampah diaktifkan.
@property (assign) NSInteger year;
- kuat adalah pengganti untuk mempertahankan.
Muncul dengan ARC.
@property (nonatomic, strong) AVPlayer *player;
- pengambil = metode Jika Anda ingin menggunakan nama yang berbeda untuk metode pengambil, Anda dapat menentukan nama khusus dengan menambahkan atribut ke properti.
Dalam kasus properti Boolean (properti yang memiliki nilai YA atau TIDAK), biasanya metode pengambil dimulai dengan kata "is"
@property (getter=isFinished) BOOL finished;
- setter = method Jika Anda ingin menggunakan nama yang berbeda untuk metode setter, Anda dapat menentukan nama khusus dengan menambahkan atribut ke properti.
Metode ini harus diakhiri dengan tanda titik dua.
@property(setter = boolBool:) BOOL finished;
- unsafe_unretained Ada beberapa kelas di Cocoa dan Cocoa Touch yang belum mendukung referensi yang lemah, yang berarti Anda tidak dapat mendeklarasikan properti yang lemah atau variabel lokal yang lemah untuk melacaknya. Kelas-kelas ini termasuk NSTextView, NSFont dan NSColorSpace, dll. Jika Anda perlu menggunakan referensi yang lemah ke salah satu kelas ini, Anda harus menggunakan referensi yang tidak aman.
Referensi yang tidak aman mirip dengan referensi yang lemah karena tidak menjaga objek terkait tetap hidup, tetapi tidak akan disetel ke nol jika objek tujuan dideallocated.
@property (unsafe_unretained) NSObject *unsafeProperty;
Jika Anda perlu menentukan beberapa atribut, cukup sertakan sebagai daftar yang dipisahkan koma, seperti ini:
@property (readonly, getter=isFinished) BOOL finished;