2012-01-27 11 views
8

Sono ancora nuovo nell'Objective-C e ho qualche difficoltà a cercare di capire il modo appropriato di usare assegnare, conservare, copiare, forte, ecc. Quando si imposta una proprietà.Chiarificazione su assegnare, conservare, copiare, forte?

Ad esempio, ho dichiarato i seguenti tipi: come devo impostare le proprietà?

@property (nonatomic, ??) NSMutableArray *myArray 
@property (nonatomic, ??) NSString *myString 
@property (nonatomic, ??) UIColor *myColor 
@property (nonatomic, ??) int *myIn 
@property (nonatomic, ??) BOOL *myBOOL 

Grazie ....

risposta

20

Per reiterare, dipende dal contesto. In una situazione di non-ARC:

@property (nonatomic, copy) NSMutableArray *myArray 
@property (nonatomic, copy) NSString *myString 
@property (nonatomic, retain) UIColor *myColor 
//Note the change to an int rather than a pointer to an int 
@property (nonatomic, assign) int myInt 
//Note the change to an int rather than a pointer to an int 
@property (nonatomic, assign) BOOL myBOOL 

La copia su myArray è quello di impedire la modifica da un altro "proprietario" dell'oggetto impostato. In un progetto ARC, le cose cambiano un po ':

@property (nonatomic, copy) NSMutableArray *myArray 
@property (nonatomic, copy) NSString *myString 
@property (nonatomic, strong) UIColor *myColor 
//Note the change to an int rather than a pointer to an int 
@property (nonatomic, assign) int myInt 
//Note the change to an int rather than a pointer to an int 
@property (nonatomic, assign) BOOL myBOOL 

Il cambiamento è principalmente a myColor nella situazione. Non si utilizzerà retain poiché non si gestisce direttamente il conteggio dei riferimenti. La parola chiave strong è un modo per affermare la "proprietà" della proprietà e simile a retain. Viene inoltre fornita una parola chiave aggiuntiva, weak, che in genere viene utilizzata al posto dell'assegnazione per i tipi di oggetto. L'esempio comune di Apple di una proprietà weak è per i delegati. Suggerirei di passare attraverso lo Transitioning to ARC Release Notes in aggiunta allo Memory Management Guide una o due volte in quanto vi è più sfumatura di quanto possa essere facilmente coperto in un post SO.

+0

Grazie David. Solo per sottolineare, però, usare 'strong' è molto più che" simile "a' retain', è un sinonimo diretto (che sono sicuro che tu già sapessi, volevo solo scrivere questo per altri lettori) http: // developer.apple.com/library/mac/releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html#//apple_ref/doc/uid/TP40011226-CH1-SW4 – dooleyo

0
@property (nonatomic, copy) NSMutableArray *myArray 
@property (nonatomic, copy) NSString *myString 
@property (nonatomic, retain) UIColor *myColor 
@property (nonatomic) int myIn 
@property (nonatomic) BOOL myBOOL 

copia oggetti mutabili, o oggetti con sottoclassi mutabili come NSString: questo impedisce loro di essere modificati da un altro proprietario. Anche se non che la sua consigliato da Apple per utilizzare oggetti mutabili come proprietà

altri scopi vengono generalmente mantenuti, con un'eccezione delegati, che sono assegnati a impedire la proprietà loop

primitive come int e BOOL sono assegnati , questa è l'opzione predefinita per @property quindi non è necessario specificare, anche se non fa male aggiungerla se ritieni che aiuti la leggibilità

+2

Perché l'utilizzo di un oggetto mutabile come proprietà non è consigliato da Apple? (Devo chiarire che questi sono in un Singleton) – wayneh

+0

penso che sia una cosa di sicurezza, ad esempio si passa un NSMutableString a un oggetto che lo trattiene. Ora quell'oggetto può modificare i tuoi dati (potrebbe essere quello che vuoi se sono le tue classi, ma se non è più sicuro attenersi a tipi immutabili). è più una raccomandazione che una regola difficile – wattson12

+0

vedo. Sto usando queste cose nelle mie classi come Singleton e hanno bisogno di essere cambiate. Sto anche provando a creare un array immutabile, ma con problemi. Grazie per l'aiuto. http://stackoverflow.com/questions/9026679/can-i-init-an-nsarray-in-a-sideleton-with-specific-values-like-a-const – wayneh

Problemi correlati