Cada objeto tiene un recuento de referencias. Cuando va a 0, el objeto se desasigna.
Suponiendo que la propiedad fue declarada como @property (retain)
:
Su primer ejemplo, línea por línea:
- El objeto es creado por
alloc
, tiene un contador de referencia de 1. El objeto
- se entrega al método
self
setAController:
, que le envía un mensaje retain
(porque el método no sabe de dónde viene el objeto), incrementando su recuento de referencia a 2.
- El código de llamada ya no necesita el objeto en sí mismo, por lo que llama
release
, decrementando el contador de referencias a 1.
Su segundo ejemplo hace básicamente los pasos 1 y 2, pero no 3, así que al final la referencia del objeto recuento es 2.
La regla es que si crea un objeto, usted es responsable de liberarlo cuando haya terminado con él. En su ejemplo, el código se hace con tempAController después de establecer la propiedad. Es responsabilidad del método setter llamar al retain
si necesita que el objeto se quede.
Es importante recordar que self.property = foo;
en Objective-C es en realidad la abreviatura de [self setProperty:foo];
y que el método setProperty:
se va a retener o los objetos de copia según sea necesario.
Si la propiedad fue declarada @property (copy)
, entonces el objeto habría sido copiado en lugar de retenido. En el primer ejemplo, el objeto original sería lanzado de inmediato; en el segundo ejemplo, el recuento de referencia del objeto original sería 1, aunque debería ser 0. Por lo tanto, aún desea escribir el código de la misma manera.
Si la propiedad fue declarada @property (assign)
, entonces self
no reclama la propiedad del objeto, y alguien más necesita retenerlo. En este caso, el primer ejemplo sería incorrecto. Este tipo de propiedades son raras, generalmente solo se usan para delegados de objeto.
Este es sólo el caso si 'aController' se declara con el @property (retener), ¿verdad? –
Eso es correcto. –
También es el patrón correcto si la propiedad se declara (copiando). El segundo patrón es el correcto para una propiedad declarada (asignar) (o con la recolección de basura habilitada). –