Prima di discutere sugli attributi di @property, si dovrebbe sapere che cosa è l'uso di @property. @property offre un modo per definire le informazioni che una classe è destinata a incapsulare. Se si dichiara un oggetto / variabile utilizzando @property, allora l'oggetto / variabile sarà accessibile ad altre classi di importazione della sua categoria. Se si dichiara un oggetto utilizzando @property nel file di intestazione, allora devi sintetizzare usando @synthesize nel file di implementazione.
Esempio:
classe .h
@interface ExampleClass : NSObject
@property (nonatomic, retain) NSString *name;
@end
classe .m
@implementation ExampleClass
@synthesize name;
@end
Ora il compilatore sintetizzerà metodi di accesso per nome.
ExampleClass *newObject=[[ExampleClass alloc]init];
NSString *name1=[newObject name]; // get 'name'
[obj setName:@“Tiger”];
Elenco degli attributi di @property: atomica. nonatomic. conservare. copia. sola lettura. leggere scrivere. assegnare. forte.
atomica: è il comportamento predefinito. Se un oggetto è dichiarato come atomica allora diventa thread-safe. mezzi a filo di sicurezza, in un tempo solo thread di un particolare esempio della classe possono avere il controllo su quell'oggetto.
Esempio :
@property NSString *name; //by default atomic
@property (atomic)NSString *name; // explicitly declared atomic
nonatomic: non è thread-safe. È possibile utilizzare l'attributo struttura nonatomic per specificare che accessors sintetizzati semplicemente impostare o restituire direttamente un valore, senza garanzie su ciò che accade se tale valore stesso si accede contemporaneamente da diversi thread. Per questo motivo, è più veloce per accedere a una proprietà nonatomic rispetto ad uno atomica.
@property (nonatomic)NSString *name;
mantenere: è richiesta quando l'attributo è un puntatore a un metodo setter object.The aumenterà mantenere conteggio dell'oggetto, in modo che occuperà memoria in pool autorelease.
@property (retain)NSString *name;
copia: se si utilizza la copia, non è possibile utilizzare conservare. Utilizzando esempio copia della classe conterrà la propria copia. Anche se una stringa mutabile è impostato e successivamente modificato, l'istanza di cattura qualunque valore che ha nel momento in cui viene impostata. saranno sintetizzati Nessun setter e getter metodi.
@property (copy) NSString *name;
NSMutableString *nameString = [NSMutableString stringWithString:@"Liza"];
xyzObj.name = nameString;
[nameString appendString:@"Pizza"];
in sola lettura: Se non si desidera consentire la proprietà da modificare tramite metodo setter, è possibile dichiarare la proprietà di sola lettura.
@property (readonly) NSString *name;
readwrite: è il comportamento predefinito. Non è necessario specificare l'attributo readwrite in modo esplicito.
@property (readwrite) NSString *name;
assegnare: genererà un setter che assegna il valore della variabile di istanza direttamente, piuttosto che copiare o suo mantenimento. Questa è la cosa migliore per i tipi primitivi come NSInteger e CGFloat, o gli oggetti non proprio direttamente, come ad esempio i delegati.
@property (assign) NSInteger year;
forte: è un sostituto per conservare.
@property (nonatomic, strong) AVPlayer *player;
unsafe_unretained: Ci sono alcune classi a Cocoa e Cocoa Touch che ancora non supportano riferimenti deboli, il che significa che non è possibile dichiarare una proprietà debole o variabile locale debole per tenere traccia di loro. Queste classi includono NSTextView, NSFont e NSColorSpace, ecc. Se è necessario utilizzare un riferimento debole per una di queste classi, è necessario utilizzare un riferimento non sicuro. Un riferimento non sicuro è simile ad un riferimento debole in quanto non tiene suo oggetto correlato vivo, ma non sarà impostato a zero se l'oggetto di destinazione si rilascia.
@property (unsafe_unretained) NSObject *unsafeProperty;