Objectivo-C Diferença entre a fixação nulo e libertando
-
06-07-2019 - |
Pergunta
Eu aprendi que em dealloc
você faz [object release];
mas em viewDidUnload
(em uma subclasse UIViewController) você faz self.object = nil
. O que é realmente a diferença porque self.object = nil
(estamos supondo objeto é uma propriedade (nonatomic, retain)
) mantém nil
(que não faz nada) e, em seguida, libera o valor antigo e, em seguida, a contagem de referência é 0 direito?
Solução
self.object = nil
chama seu setter, que irá liberar o valor antigo, definir o membro para nil
e, possivelmente, fazer outras coisas (que é um método, para que ele pudesse fazer qualquer coisa). A parte "qualquer coisa" de que é potencialmente perigoso; consulte esta questão , por exemplo.
[object release]
libera o valor antigo, mas deixa aos Estados como um ponteiro agora pendurado, o que é uma boa receita para bugs. Em dealloc
isso realmente não importa, já que o ponteiro em si está prestes a ir embora também, mas em qualquer outro caso, é uma idéia muito ruim para liberar um membro sem defini-lo como nil
.
(Como nota, você nunca deve assumir que liberar um objeto dá uma contagem de referência de 0. Ele libera sua referência, mas outros objetos ainda pode ter referências a ele.)
Outras dicas
Se você fizer object = nil
sem [object release]
, que o poder provoca fuga de memória. Se você fizer [object release]
sem object = nil
depois, objeto se torna apontador pendente como @ Jim sugeriu. self.object = nil
é um açúcar para chamada de função setter.
Se você fizer [liberação objeto], e quiser acessar o objeto do aplicativo simplesmente falhar. Se você fizer objeto = nil, e quiser acessar o objeto nada irá executar.
A razão está no [liberação objeto], você está tentado liberar o objeto. pelo que a sua não têm qualquer ponteiro (sem memoty) .No object = nil,
você está tentado atribuir o objeto com ponteiro nulo. por isso, se u tentar acessar o objeto não vai acontecer nada.
Geralmente, escreveu o código como [object release]; object = nil;
porque se u acessar o objeto de forma inesperada, o costume aplicativo caiu.
Se você acabou de lançar um objeto, objeto, em seguida, ele vai se tornar liberado.
E se você tentar realizar qualquer tipo de operação no objeto liberado em seguida, o app apresentar falha. Para evitar tais acidentes, é sempre preferível "atribuir o objeto a zero depois de liberá-lo". Porque todos nós sabemos as intervenções efectuadas no nulo não será executada:)