2010-03-08 6 views

Respuesta

45

En general, retener un objeto aumentará su retención en uno. Esto ayudará a mantener el objeto en la memoria y evitará que se disperse. Lo que esto significa es que si solo tiene una versión retenida de, usted comparte que copia con quien se lo haya pasado.

Copiando un objeto, como sea que lo haga, debe crear otro objeto con valores duplicados de. Piense en esto como un clon. NO compartes el clon con quien te lo haya pasado.

Cuando se trata de NSString s, en particular, puede que no sea capaz de asumir que quien le está dando una NSString está verdaderamente le da una NSString. Alguien podría estar entregando una subclase (NSMutableString, en este caso) lo que significa que podrían modificar los valores bajo las cubiertas. Si su aplicación depende del valor ingresado y alguien la cambia, puede tener problemas.

+15

Cabe mencionar que 'copy' es equivalente a' retain' para la mayoría de las clases 'Foundation' que no son mutables. – rpetrich

+0

Muy informativo ... – Krishnan

+3

Podría sugerir que "usted ** comparta ** esa * instancia * con quien se lo pasó" es más claro que "usted ** comparte ** esa * copia * con quien se lo pasó" ? (Viendo que estamos hablando de copiar ya) –

23

de retención y la copia son dos cosas diferentes, la primera es conceptualmente llamada por referencia, mientras que la segunda es llamada por valor.

3

La mayor diferencia es que si usa 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 utilizar la precaución que usted sabe con certeza de qué tipo va a operar (o verificar el soporte de ese protocolo) cuando intente llamar al copy.

La mejor regla general para usar copy que puedo pensar, es establecer siempre las propiedades NSString para "copiar" en lugar de retener. De esta forma, obtendrás lecturas más precisas del instrumento de Fugas si te equivocas y te olvidas de soltar una cuerda a la que se agarra un objeto. Se deben pensar más cuidadosamente otros usos de la copia.

1

copia: crea una nueva instancia que es una copia del receptor. Significa que tendrá 2 diferentes

conservar: Aumenta el retainCount del receptor. Un objeto se elimina de la memoria - (con dealloc), cuando retainCount es 0.

+1

Creo que te refieres a "dealloc'ed" (un poco incómodo para verbify esa palabra), no "estancado" – Brian

5

si usa retener, copia el valor del puntero del original.retain también incrementa el recuento de referencias en uno. pero en el caso de una copia, duplica los datos a los que hace referencia el puntero y los asigna a la variable de instancia de la copia.

7

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

copia - Se crea un nuevo objeto y cuando el nuevo objeto se crea retener recuento será 1.

Hope Esta Ayuda para U ... :)

0

retener atributo se especifica de tal manera que puede retener la otra memoria i.e se puede hacer que apunte a otra dirección también copia Primero copia la dirección y luego la conserva.

6

Es un antiguo puesto, pero aquí está mi punto de vista sobre la cuestión

Permanencia aumenta la cuenta de retención de un objeto por 1 y toma posesión de un objeto.

Considerando que copy copiará los datos presentes en la ubicación de la memoria y los asignará a la variable para que en el caso de copiar copie los datos de una ubicación, asígnelos a la variable que aumenta el conteo retenido.

Sólo recuerde que conservan obras de referencia y de copia de obras en el valor

+0

Retener no copia la referencia. –

+0

¿La 'copia' crea un objeto nuevo? , – Dhiru

Cuestiones relacionadas