Pregunta

He aprendido que en dealloc haces [liberación de objeto]; pero en viewDidUnload (en una subclase de UIViewController) haces < code> self.object = nil . ¿Cuál es realmente la diferencia porque self.object = nil (asumimos que el objeto es una propiedad (no atómica, retener) ) retiene nil ( que no hace nada) y luego libera el valor anterior y luego el recuento de referencia es 0 ¿verdad?

¿Fue útil?

Solución

self.object = nil llama a su configurador, que liberará el valor anterior, establecerá el miembro en nil y posiblemente haga otras cosas (es un método, así que podría hacer cualquier cosa). El " cualquier cosa " parte de eso es potencialmente peligroso; consulte esta pregunta , por ejemplo.

[lanzamiento de objeto] libera el valor anterior, pero deja al miembro como un puntero que ahora cuelga, que es una buena receta para los errores. En dealloc realmente no importa, ya que el puntero en sí está a punto de desaparecer también, pero en cualquier otro caso es una muy mala idea liberar un miembro sin configurarlo en nil .

(Como nota al margen, nunca debe suponer que liberar un objeto le da un recuento de referencia de 0. Libera su referencia, pero otros objetos aún pueden tener referencias a él).

Otros consejos

Si hace object = nil sin [liberación de objeto] , eso podría causar pérdida de memoria. Si luego hace [lanzamiento de objeto] sin object = nil , el objeto se convierte en un puntero colgante como sugirió @Jim. self.object = nil es un azúcar para la llamada a la función setter.

Si lo hace [liberación de objeto], y desea acceder al objeto, la aplicación simplemente falla. Si hace object = nil y desea acceder al objeto, nada se realizará.

La razón está en la [liberación del objeto], se intentó liberar el objeto. por lo que no tiene ningún puntero (sin memoria). En el object = nil, se intenta asignar el objeto con un puntero nulo. así que si intentas acceder al objeto no pasará nada.

Generalmente escribimos el código como [ lanzamiento del objeto]; object = nil; porque si accedes al objeto inesperadamente, la aplicación no se bloqueará.

Si solo sueltas un objeto, se convertirá en objeto liberado.

Y si intenta realizar cualquier tipo de operación en un objeto liberado, su aplicación se bloquea. Para evitar tales accidentes, siempre es preferible asignar su objeto a cero después de soltarlo. Porque todos sabemos que las operaciones realizadas en nil no se ejecutarán :)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top