NSKEYEDUNCHIVER AutoRelease?
-
27-09-2019 - |
Pergunta
Estou fazendo algum arquivamento para uma lista de propriedades e, quando desarquiva, meus dados usando o NSKEYEDUNCHIVER, acho que meu aplicativo trava se eu liberar o objeto depois. Fiquei me perguntando se a mensagem de acabamento de acabamento também seleciona o objeto. Parece estranho que ele trava quando eu o libero.
Solução
O que você libera? NSKEYEDUNCHIVER ou objeto desarquivado?
Se você lançar o NSKEYEDUNCHIVER ou não depende de como você o criou. Segue regras usuais. Se você usar alloc
+ initForReadingWithData
você deve lançar, se usar unarchiveObjectWithData
ou unarchiveObjectWithFile
- Você não deveria.
Em relação ao resultado de decodeObjectForKey
, também segue a regra usual de que o método retorna o objeto autorizado e você não deve liberá -lo, a menos que o retire explicitamente.
Em relação a finishDecoding
: Você deve chamá -lo explicitamente antes que o objeto NSKEYEDUNCHIVER seja lançado. Você não deve usar o UNARCIVER depois desse ponto, mas o objeto ainda está vivo.
Outras dicas
Se você inicializar o UNARCIVER com
[[NSKeyedUnarchiver alloc] initForReadingWithData:data]
Então você é responsável por lançá -lo quando terminar de desarchar.
Se estiver travando depois de liberá -lo, é provável que seu bug esteja em outro lugar. Provavelmente porque você está usando objetos que seu UNARCIVER fornece sem mantê -los. E quando o UNARCIVER é resolvido, ele libera os objetos que forneceram para você. Se você não os reter, eles serão desalocados e você falhará quando você faz referência a esses objetos.