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?

Foi útil?

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:)

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