2012-01-27 13 views
8

Todavía soy nuevo en Objective-C y tengo algunas dificultades para tratar de encontrar la forma adecuada de usar asignar, retener, copiar, fuerte, etc. al establecer una propiedad.Aclaración sobre asignar, retener, copiar, fuerte?

Por ejemplo, tengo los siguientes tipos declarados: ¿cómo debería establecer las propiedades?

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

Gracias .... objetos mutables

Respuesta

20

Reiterando, depende del contexto. En una situación de no-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 en miMatriz es para evitar la modificación por otro "dueño" del objeto que ha establecido. En un proyecto ARC, las cosas cambian un poco:

@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 

El cambio se debe principalmente a myColor en su caso. No usaría retain ya que no está administrando el recuento de referencias directamente. La palabra clave strong es una forma de afirmar la "propiedad" de la propiedad y es similar al retain. También se proporciona una palabra clave adicional, weak, que normalmente se usaría en lugar de asignar para tipos de objetos. El ejemplo común de Apple de una propiedad weak es para delegados. Recomiendo pasar por el Transitioning to ARC Release Notes además del Memory Management Guide una o dos veces, ya que hay más detalles de los que se pueden cubrir fácilmente en una publicación SO.

+0

Gracias David. Sin embargo, para señalar, usar 'strong' es más que simplemente' 'similar '' para' retener', es un sinónimo directo (que estoy seguro ya sabías, solo quería explicar esto a otros lectores) 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, u objetos con subclases mutables como NSString: esto les deja de ser modificados por otro propietario. aunque yo no creo que es recomendado por Apple para utilizar los objetos mutables como las propiedades

otros objetos se retienen generalmente, con una excepción de los delegados, que se asignan para evitar bucles de la propiedad

primitivas como int y BOOL se asignan , esta es la opción predeterminada para @property, por lo que no es necesario especificarla, aunque no hace daño agregarla si cree que ayuda a la legibilidad

+2

¿Por qué el uso de un objeto mutable como propiedad no sería recomendado por Apple? (Debo aclarar que estos están en un Singleton) – wayneh

+0

creo que es algo seguro, digamos que pasa un NSMutableString a un objeto que lo retiene. Ese objeto ahora puede modificar sus datos (que puede ser lo que usted desea si son sus clases, pero si no es más seguro adherirse a los tipos inmutables). es más una recomendación que una regla dura – wattson12

+0

Veo. Estoy usando estos en mis clases como Singleton y necesitan ser cambiados. Estoy tratando de configurar una matriz inmutable también, pero con problemas. Gracias por tu ayuda. http://stackoverflow.com/questions/9026679/can-i-init-an-nsarray-in-a-singleton-with-specific-values-like-a-const – wayneh

Cuestiones relacionadas