2010-11-03 29 views
14

No estoy seguro sobre qué usar y cuándo. ¿Hay una regla empírica? ¿En la mayoría de los casos, se puede usar alguno de ellos? ¿Alguna regla especial?Cuándo utilizar retener y cuándo utilizar la copia

@property (nonatomic, retain) NSDate *theDateFromPicker; 
@property (nonatomic, copy) NSDate *theDateFromPicker; 

En este caso, ¿cuál sería la mejor opción?

Gracias -Code

Respuesta

14

Deseará utilizar la copia cuando no desee la posibilidad de que el objeto sea modificado por otro objeto.

Un buen ejemplo es NSString. Digamos que usted tiene este código:

@property (nonatomic, retain) NSString *aString; 

// in some other class 

NSMutableString *mutableString = [[NSMutableString alloc] initWithString:@"test"]; 
theObject.aString = mutableString; // theObject retains the mutable string 

[mutableString setString:@"test2"]; 

Lo que sucede aquí es que se asigna el valor de "prueba" para aString, pero luego se modificó externamente y se convierte en "test2", porque retenido la cadena mutable . Si configuró copy, esto no sucedería, porque está haciendo una copia de la cadena mutable.

1

con la copia que tendrá 2 objetos diferentes. Entonces, si modifica uno, el otro no se modificará.

1

La copia le ofrece un objeto diferente.

En general, solo debe usar retener, a menos que explícitamente quiera hacer copias de los objetos. Cada vez que copias debes liberar, así que tenlo en cuenta.

Un buen momento para usar -copiar es cuando va a utilizar la enumeración para agregar o quitar objetos.

Tome una matriz, por ejemplo. Si está enumerando la matriz, no puede agregar o eliminar objetos durante la enumeración o se bloqueará. Antes de comenzar la enumeración, use -copy para crear una nueva copia de la matriz y, como está enumerando, si necesita agregar/eliminar un objeto (mutar), puede hacerlo en la copia.

Cuando haya terminado con la enumeración, puede volver a establecer la copia en el original.

9

NSDate es inmutable y no tenemos una subclase mutable en este momento. Entonces retener está bien. Copiar tampoco va a doler, y de hecho espero que la copia simplemente devuelva la misma instancia aquí (retenida una vez más).

La razón para usar copia en NSString es que se puede obtener un NSMutableString pasó a su objeto en lugar que podría cambiar justo debajo de sus pies. Esto no puede suceder aquí.

3

En iOS, por lo general, trabajará con un solo hilo por lo que no hay posibilidad de que su objeto se modifique al mismo tiempo. Además, incluso si especifica copy, la propiedad puede modificarse simplemente configurándola nuevamente.

La regla del pulgar es: "utilizar retain en iOS"

Sin embargo, hay algunas situaciones en las que se requiere el uso de copia/aconsejó:

  • que necesidad utilización copia si acepta Bloquea (bloques de código agregados con iOS4) ya que los bloques deben copiarse en el montón antes de retener (consulta Copying blocks (ie: copying them to instance variables) in Objective-C para obtener más detalles
  • si escribes código que se ejecutará en backgrou nd es más seguro de usar (atómico, copia).
  • debe considerar el uso de la copia si desea asegurarse de que solo la asignación a la propiedad cambia su valor. (Que podría ser útil si se implementa MVA)
3

La regla de oro es usar copy si la clase implementa el protocolo NSCopying a menos que tenga una buena razón para no hacerlo. La única buena razón por la que puedo pensar es en el rendimiento. Por ejemplo, técnicamente debe usar copy para las propiedades NSMutableArray, pero como se puede imaginar, copiar matrices mutables de gran tamaño costará mucho en tiempo de CPU y memoria.

Cuestiones relacionadas