Necesito realizar una copia profunda de un objeto personalizado que tenga sus propios objetos. He estado leyendo y estoy un poco confundido sobre cómo heredar NSCopying y cómo usar NSCopyObject.
objective-c
copy
ben
fuente
fuente
Respuestas:
Como siempre ocurre con los tipos de referencia, hay dos nociones de "copia". Estoy seguro de que los conoce, pero para completarlos.
Quieres lo último. Si este es uno de sus propios objetos, simplemente debe adoptar el protocolo NSCopying e implementar - (id) copyWithZone: (NSZone *) zone. Eres libre de hacer lo que quieras; aunque la idea es que hagas una copia real de ti mismo y la devuelvas. Llame a copyWithZone en todos sus campos para hacer una copia en profundidad. Un ejemplo simple es
fuente
autorelease
, o me estoy perdiendo algo aquí?copyWithZone:
cumple con este criterio, por lo tanto, debe devolver un objeto con un recuento de retención de +1.alloc
lugar deallocWithZone:
desde que se pasó la zona?allocWithZone
.copy
,mutableCopy
ycopyWithZone
, ligado a una de las respuestas, está aquí.La documentación de Apple dice
para agregar a la respuesta existente
fuente
No visible @interface for 'NSObject' declares the selector 'copyWithZone:'
. Supongo que esto solo es necesario cuando heredamos de alguna otra clase personalizada que implementacopyWithZone
No sé la diferencia entre ese código y el mío, pero tengo problemas con esa solución, así que leí un poco más y descubrí que tenemos que configurar el objeto antes de devolverlo. Me refiero a algo como:
Agregué esta respuesta porque tengo muchos problemas con este problema y no tengo ni idea de por qué está sucediendo. No sé la diferencia, pero está funcionando para mí y tal vez también pueda ser útil para otros :)
fuente
Creo que esta línea causa una pérdida de memoria, porque accede a la
obj
propiedad a través de la cual (supongo) se declara comoretain
. Entonces, el conteo de retención aumentará por propiedad ycopyWithZone
.Creo que debería ser:
o:
fuente
También existe el uso del operador -> para copiar. Por ejemplo:
El razonamiento aquí es que el objeto copiado resultante debe reflejar el estado del objeto original. Los "." El operador podría introducir efectos secundarios, ya que este llama a los captadores que, a su vez, pueden contener lógica.
fuente