objective c - ¿Cuál es la diferencia entre "copiar" y "retener"?
objective-c nsstring (9)
¿Cuál es la diferencia entre copy
y retain
para NSString
?
- (void)setString:(NSString*)newString
{
string = [newString copy];
}
En una configuración general, la retención de un objeto aumentará su cuenta de retención en uno. Esto ayudará a mantener el objeto en la memoria y evitará que se vuele. Lo que esto significa es que si solo tienes una versión retenida de ella, compartes esa copia con quien te la haya pasado.
Copiar un objeto, sin embargo, usted lo hace, debe crear otro objeto con valores duplicados . Piense en esto como un clon. NO compartes el clon con quien te lo haya pasado.
Al tratar con NSString
s en particular, es posible que no pueda asumir que quien le está dando una NSString
realmente le está dando una NSString
. Alguien podría entregarle una subclase ( NSMutableString
, en este caso), lo que significa que podrían modificar los valores que se encuentran debajo de las cubiertas. Si su aplicación depende del valor pasado y alguien lo cambia, usted puede tener problemas.
Es un post viejo, pero aquí está mi opinión sobre la pregunta.
Retain aumenta el conteo de retención de un objeto en 1 y toma posesión de un objeto.
Mientras que copia copiará los datos presentes en la ubicación de la memoria y los asignará a la variable, por lo que en el caso de la copia, primero está copiando los datos de una ubicación, asignándolos a la variable que aumenta la cuenta de retención.
Solo recuerde que retener trabajos en referencia y copiar trabajos en valor
La mayor diferencia es que si utiliza la copy
, el objeto que está copiando debe implementar el protocolo NSCopying
(muy fácil de hacer). No todos los objetos implementan eso, por lo que debe tener cuidado de saber con certeza con qué tipo operará (o buscará el soporte de ese protocolo) cuando intente llamar copy
.
La mejor regla de oro para usar la copy
que se me ocurre es establecer siempre las propiedades de NSString en "copiar" en lugar de retener. De esa manera, obtendrá lecturas más precisas del instrumento de Fugas si se equivoca y se olvida de liberar una cuerda a la que se sostiene un objeto. Otros usos de la copia deben ser más cuidadosamente pensados.
Retener un objeto significa que el conteo de retenciones aumenta en uno. Esto significa que la instancia del objeto se mantendrá en la memoria hasta que se retenga el conteo caiga a cero. La propiedad almacenará una referencia a esta instancia y compartirá la misma instancia con cualquier otra persona que la haya retenido también. Copiar significa que el objeto se clonará con valores duplicados. No se comparte con nadie más.
Retener y copiar son dos cosas diferentes, la primera es conceptualmente llamada por referencia, mientras que la segunda es llamada por valor.
el atributo de retención se especifica de tal manera que puede retener la otra memoria, es decir, se puede hacer que apunte a otra dirección. También copie.
si usa retener, copia el valor del puntero del original one.retain también incrementa el recuento de referencia en uno. pero en caso de copia, duplica los datos a los que hace referencia el puntero y los asigna a la variable de instancia de la copia.
Copiar: crea una nueva instancia que es una copia del receptor. Significa que tendrás 2 diferentes.
retener: aumenta la retainCount
del receptor. Un objeto se elimina de la memoria - (con dealloc), cuando retainCount es 0.
retener : se realiza en el objeto creado y solo aumenta el recuento de referencias.
Copiar : crea un nuevo objeto y cuando se crea un nuevo objeto, el recuento será 1.
Espero esta ayuda para U ... :)