esto es correcto:
self.annotation = [[[Annotation alloc] initWithCoordinate:location] autorelease];
porque la propiedad de anotación se declara como una propiedad de retener, por lo que la asignación a la misma se incrementará su número de retener.
también necesitará, de todos modos, liberar self.annotation en -dealloc
.
en resumen:
init fijará retener recuento a 1;
asignando a self.annotation, lo establecerá en 2;
la liberación automática volverá a establecerlo en 1 cuando el ciclo principal se ejecute de nuevo;
liberar en dealloc establecerá el conteo de retención en 0, por lo que el objeto será desasignado);
la mejor manera de pensar en autorelease
es la siguiente, en mi opinión: autorelease
se "programa" un "automático" release
para el objeto en algún momento (casi) en el futuro (por lo general cuando el flujo de control va de vuelta al ciclo principal, pero los detalles están ocultos en las manos de Apple).
autorelease
es sobre todo útil en conjunción con init
, específicamente en los siguientes casos:
cuando init
una variable local, de modo que usted no tiene que release
explícitamente antes de que salga del ámbito (el ciclo principal lo hará por usted);
cuando regrese un puntero a un objeto que acaba de crear sin mantener la propiedad de la misma (caso típico de la create/make*
tipo de selectores, se requiere que el receptor retain
para conseguir la propiedad);
con propiedades que retain
, cuando se asigna a ellos un objeto que deben poseer de forma única;
con estructuras de datos que se incrementan la cuenta de retención (NSMutableArray
, NSMutableDictionary
, etc.): por lo general debe autorelease
una nueva init
objeto ed cuando se agrega a dicha estructura de datos.
aparte del caso 2, es evidente que el uso de autorelease
está destinado a mejorar la legibilidad del código y reducir la posibilidad de errores (lo que significa que en todos los demás casos, usted podría simplemente release
explícitamente su objeto después de la asignación o al final del alcance).
al usar propiedades, siempre debe verificar si son del caso retain
o assign
/copy
; en el primer caso, la asignación de un nuevo objeto ed init
a una propiedad generalmente requiere autorelease
.
De todos modos, sugeriría al menos rozar uno de los muchos tutoriales en memory management for iOS.
Posible duplicado de [Autorelease vs. release] (http://stackoverflow.com/questions/4077159/autorelease-vs-release) y hay muchas, muchas otras preguntas que responderán a esto si se toma el tiempo para leer ellos: [Buscar: iPhone retiene la propiedad de liberación automática] (http://stackoverflow.com/search?q=iphone+retain+property+autorelease) Esto: [Release/autorelease confusion] (http://stackoverflow.com/questions/ 1121343/release-autorelease-confusion-in-cocoa-for-iphone) es probablemente uno de los mejores. –