Preciso copiar em profundidade um objeto personalizado que possui objetos próprios. Tenho lido por aí e estou um pouco confuso sobre como herdar NSCopying e como usar NSCopyObject.
objective-c
copy
ben
fonte
fonte
Respostas:
Como sempre com os tipos de referência, existem duas noções de "cópia". Tenho certeza que você os conhece, mas para a integridade.
Você quer o último. Se este for um de seus próprios objetos, você precisa simplesmente adotar o protocolo NSCopying e implementar - (id) copyWithZone: (NSZone *) zone. Você é livre para fazer o que quiser; embora a ideia seja fazer uma cópia real de si mesmo e devolvê-la. Você chama copyWithZone em todos os seus campos para fazer uma cópia em profundidade. Um exemplo simples é
fonte
autorelease
, ou estou perdendo alguma coisa aqui?copyWithZone:
atende a esse critério, portanto, deve retornar um objeto com uma contagem de retenção de +1.alloc
vez de,allocWithZone:
já que a zona foi aprovada?allocWithZone
.copy
,mutableCopy
ecopyWithZone
, vinculado em uma das respostas, está aqui.A documentação da Apple diz
para adicionar à resposta existente
fonte
No visible @interface for 'NSObject' declares the selector 'copyWithZone:'
. Acho que isso só é necessário quando estamos herdando de alguma outra classe personalizada que implementacopyWithZone
Não sei a diferença entre esse código e o meu, mas tenho problemas com essa solução, então li um pouco mais e descobri que temos que definir o objeto antes de devolvê-lo. Quero dizer algo como:
Eu adicionei essa resposta porque tenho muitos problemas com esse problema e não tenho ideia do por que isso está acontecendo. Não sei a diferença, mas está funcionando para mim e talvez possa ser útil para os outros também:)
fonte
Eu acho que essa linha causa vazamento de memória, porque você acessa
obj
através da propriedade que é (presumo) declarada comoretain
. Portanto, a contagem retida será aumentada por propriedade ecopyWithZone
.Eu acredito que deveria ser:
ou:
fonte
Também existe o uso do operador -> para copiar. Por exemplo:
O raciocínio aqui é que o objeto copiado resultante deve refletir o estado do objeto original. O "." operador pode introduzir efeitos colaterais, pois este chama getters que, por sua vez, podem conter lógica.
fonte