Înainte de a discuta despre atributele @property, ar trebui să știi ce este utilizarea de @property. @property oferă o modalitate de a defini informațiile pe care o clasă este destinată a îngloba. Dacă declarați un obiect / variabila folosind @property, atunci acel obiect / variabilă va fi accesibile altor clase care importă clasa sa. Dacă declarați un obiect folosind @property în fișierul antet, atunci trebuie să-l sintetizeze folosind @synthesize în fișierul de punere în aplicare.
Exemplu:
clasa .h
@interface ExampleClass : NSObject
@property (nonatomic, retain) NSString *name;
@end
clasa .m
@implementation ExampleClass
@synthesize name;
@end
Acum, compilatorul va sintetiza Accessor metode de nume.
ExampleClass *newObject=[[ExampleClass alloc]init];
NSString *name1=[newObject name]; // get 'name'
[obj setName:@“Tiger”];
Lista de atribute ale @property: atomice. nonatomic. reține. copie. readonly. Citeste, scrie. atribui. puternic.
atomic: Este comportamentul implicit. În cazul în care un obiect este declarat ca atomica, atunci devine thread-safe. mijloace thread-safe, la un moment dat doar un fir dintr-un caz particular de acea clasă poate avea controlul asupra acelui obiect.
exemplu:
@property NSString *name; //by default atomic
@property (atomic)NSString *name; // explicitly declared atomic
nonatomic: Nu este thread-safe. Puteți utiliza atributul de proprietate nonatomic pentru a specifica faptul că sintetizate pur și simplu setați Conturi cu acces sau de a reveni în mod direct o valoare, fără garanții cu privire la ceea ce se întâmplă în cazul în care aceeași valoare este accesată simultan din fire diferite. Din acest motiv, este mai rapid pentru a avea acces la o proprietate nonatomic decât una atomică.
@property (nonatomic)NSString *name;
reține: este necesară atunci când atributul este un pointer la o metodă setter object.The va crește păstra numărul de a obiectului, astfel încât acesta va ocupa de memorie în AutoreleasePool.
@property (retain)NSString *name;
copie: Dacă utilizați copia, nu puteți utiliza reține. Utilizarea copie instanță a clasei va conține propria copie. Chiar dacă un șir de caractere mutabil este setat și modificat ulterior, instanța capturează orice valoare are în momentul în care este setat. Nu există metode setter și getter vor fi sintetizate.
@property (copy) NSString *name;
NSMutableString *nameString = [NSMutableString stringWithString:@"Liza"];
xyzObj.name = nameString;
[nameString appendString:@"Pizza"];
numai citire: Dacă nu doriți să permiteți proprietatea de a fi schimbat prin metoda setter, puteți declara proprietatea readonly.
@property (readonly) NSString *name;
ReadWrite: este comportamentul implicit. Nu aveți nevoie să specificați atributul ReadWrite în mod explicit.
@property (readwrite) NSString *name;
alocați: va genera un setter care atribuie valoarea variabilei la instanță în mod direct, mai degrabă decât copierea sau păstrarea acestora. Acest lucru este cel mai bun pentru tipurile primitive, cum ar fi NSInteger și CGFloat, sau obiecte pe care nu le dețineți în mod direct, cum ar fi delegați.
@property (assign) NSInteger year;
puternic: este un înlocuitor pentru păstreze.
@property (nonatomic, strong) AVPlayer *player;
unsafe_unretained: Există câteva clase în cacao și cacao Touch care nu acceptă încă referințe slabe, ceea ce înseamnă că nu se poate declara o proprietate slabă sau variabilă locale slabe pentru a ține evidența acestora. Aceste clase includ NSTextView, NSFont și NSColorSpace, etc. Dacă trebuie să utilizați o referință slabă la una dintre aceste clase, trebuie să utilizați o referință nesigură. O referință nesigură este similară cu o referință slabă în faptul că nu ține obiectul său asociat în viață, dar nu va fi setat la zero în cazul în care obiectul de destinație este deallocated.
@property (unsafe_unretained) NSObject *unsafeProperty;