2009-04-24 23 views

Respuesta

4

Creo que al trabajar con objetos casi siempre se usa retener en lugar de asignar y cuando se trabaja con tipos primitivos, estructuras, etc., se utiliza la asignación (ya que no se pueden retener objetos). Eso es porque quiere que el objeto con la propiedad decida cuándo se hace con el objeto, no con otra cosa. La Guía de administración de memoria de Apple indica esto:

Hay ocasiones en que no desea que se elimine un objeto recibido ; para el ejemplo , puede que necesite almacenar en caché el objeto en una variable de instancia. En este caso, solo usted sabe cuando el objeto ya no es necesario, por lo que necesita la energía para asegurar que el objeto no se deseche mientras usted todavía lo está utilizando. Esto se hace con un mensaje de retención , que conserva el efecto de una liberación automática pendiente (o sustituye a en un mensaje de liberación posterior o de liberación automática ). Al retener un objeto, , asegúrese de que no será desasignado hasta que haya terminado con él.

Para una discusión sobre el uso de copy vs retain, vea this SO question.

0

Si tiene intención de conservar el objeto y usarlo, utilice retener. De lo contrario, puede ser liberado y terminarás con errores con tu código.

53

Asignar es para valores primitivos como BOOL, NSInteger o doble. Para los objetos, use retener o copiar, dependiendo de si desea mantener una referencia al objeto original o hacer una copia del mismo.

La única excepción común son las referencias débiles, donde desea mantener un puntero a un objeto pero no puede retenerlo debido a los ciclos de referencia. Un ejemplo de esto es el patrón delegado, donde un objeto (por ejemplo, una vista de tabla) mantiene un puntero a su delegado. Como el objeto delegado conserva la vista de tabla, tener la vista de tabla retener al delegado significaría que nunca se lanzará ninguno. En su lugar, se utiliza una referencia débil en este caso. En esta situación, usaría asignar cuando crea su propiedad.

Cuestiones relacionadas