2011-06-22 9 views
7

Entonces, solo una simple pregunta, cuando debería usar copy en lugar de usar retener. Traté de mirar desde Internet, pero no lo entendí del todo. Entonces, ¿podría alguien aclararme?Objective C copie y conserve

+0

posible duplicado de [propiedad de NSString: ¿copiar o conservar?] (Http://stackoverflow.com/questions/387959/nsstring-property-copy-or-retain) o [Objective C Assign Copy Retain] (http://stackoverflow.com/questions/4510913/) o [Retener copia de objetos liberados automáticamente] (http://stackoverflow.com/questions/6416963/) o [Cuándo usar retener y cuándo usar copia] (http: // stackoverflow .com/questions/4087208 /) o [@property: ¿Conservar o copiar?] (http://stackoverflow.com/questions/5616170/) o [muchos otros] (http://stackoverflow.com/search?q= % 5Bobjc% 5D + copy + retener) –

+0

En esta defensa de preguntas, las demás son todas específicas de los tipos de propiedad, pero sí, esta pregunta se ha hecho mucho. –

Respuesta

27

Utilizará copy cuando desee garantizar el estado del objeto.

NSMutableString *mutString = [NSMutableString stringWithString:@"ABC"]; 
NSString *b = [mutString retain]; 
[mutString appendString:@"Test"]; 

En este punto, b estaba arruinado por la tercera línea.

NSMutableString *mutString = [NSMutableString stringWithString:@"ABC"]; 
NSString *b = [mutString copy]; 
[mutString appendString:@"Test"]; 

En este caso, b es la cadena original y no está modificada por la 3ra línea.

Esto se aplica a todos los tipos mutables.

+4

Vale la pena señalar que muchos tipos inmutables implementarán -copy llamando a -retain; Dado que su valor nunca cambiará, no tiene sentido tener dos copias en la memoria. Dicho esto, sin información adicional, siempre debe codificar como si no supiera si un objeto en particular es mutable o no. El hecho de que escriba su propiedad como NSString no significa que alguien no le pase una NSMutableString (como se ilustra arriba). – ipmcc

3

La copia es útil cuando no desea que el valor que recibe cambie sin que usted lo sepa. Por ejemplo, si tiene una propiedad que es NSString y confía en que esa cadena no cambia una vez que está configurada, debe usar copiar. De lo contrario, alguien puede pasarle un NSMutableString y cambiar el valor que a su vez cambiará el valor subyacente de su NSString. Lo mismo ocurre con NSArray y NSMutableArray, excepto que la copia en una matriz solo copia todas las referencias de puntero a una nueva matriz, pero evitará que las entradas se eliminen y añadan.

7

conservar: Se realiza en el objeto creado, y solo aumenta el recuento de referencias.

copia - Crea un objeto nuevo y cuando se crea un objeto nuevo, se conserva la cuenta será 1. Espero que esto pueda ayudarlo.

+0

copia no siempre crea un nuevo objeto – newacct

+0

así que al retener aumentamos la cuenta de referencia en el mismo objeto, mientras que para la copia aumentamos la cuenta de referencia en un nuevo objeto? – Honey