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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top