Como você remove um observador de um objeto sob ARC ? Nós apenas adicionamos o observador e esquecemos de removê-lo? Se não gerenciamos mais a memória manualmente, onde renunciamos à observação?
Por exemplo, em um controlador de visualização:
[self.view addObserver:self
forKeyPath:@"self.frame"
options:NSKeyValueObservingOptionNew
context:nil];
Anteriormente, eu chamaria removeObserver:
o dealloc
método do controlador de visualização .
@"frame"
vez de@"self.frame"
?Respostas:
Você ainda pode implementar
-dealloc
sob ARC, que parece ser o local apropriado para remover a observação dos valores-chave. Você simplesmente não chama mais[super dealloc]
de dentro deste método.Se você estava substituindo
-release
antes, você estava fazendo as coisas da maneira errada.fonte
[super dealloc]
. Quem mais deveria fazer isso por você.[super dealloc]
um método dealloc. Não tenho ideia de como isso funcionaria, então, ao criar uma subclasse da classe mencionada. Talvez seja apenas aconselhável usar emfinalize
vez disso (para onde você ligar[super finalize]
)[super dealloc]
último nesse método é quase sempre um bug no gerenciamento de memória manual, o compilador trata disso para você agora, e é por isso que você não pode mais chamar-dealloc
diretamente. As únicas coisas que você insere em um-dealloc
método sob ARC são quaisquer recursos não-objeto que você precisa liberar ou tarefas de limpeza, como remover observadores. O texto que eles usam é um pouco confuso, mas é isso que eles querem dizer.-finalize
é usado para isso em coleta de lixo, onde-dealloc
nunca é chamado, mas é perfeitamente aceitável colocar esse código em-dealloc
ARC.[super dealloc]
é chamado automaticamente, por isso é um erro chamá-lo no ARC.Eu faço isso com este código
fonte
dealloc
? É tarde demais para fazer algo a respeito.Em outro lugar no estouro de pilha, Chris Hanson aconselha o uso do método finalize para esse propósito e a implementação de um método invalidate separado para que os proprietários possam dizer aos objetos que eles terminaram. No passado, eu descobri que as soluções do Hanson eram bem pensadas, então irei com isso.
fonte
-dealloc
nunca é chamado. No ARC, é. É perfeitamente aceitável remover os observadores KVO-dealloc
, como Chris Lattner (quem sabe do que está falando) indica nos fóruns de desenvolvedores da Apple aqui: devforums.apple.com/message/475850