¿Cuál es el punto en un retienen seguido inmediatamente por un autorelease?
-
30-09-2019 - |
Pregunta
Estoy buscando en algún código fuente abierto y tratar de entender por qué el autor tiene algo que se hace de una manera particular.
La clase es una envoltura alrededor de NSArray
para crear una estructura de datos de la pila con push, pop, etc.
Un método es topObject
que devuelve el objeto superior en la pila y su aplicación es:
- (id)top {
return [[[stack lastObject] retain] autorelease]; // stack is an instance of NSMutableArray
}
¿Qué pasa con el retienen seguido de un autorelease inmediata?
Mi reacción inicial fue que esto impediría una advertencia sobre el analizador de una pérdida de memoria, pero analiza sin retener / autorelease y todavía había ninguna advertencia.
Mirando el ciclo de vida, se crea un objeto, desplaza a la pila y se suelta, por lo que la pila posee el objeto (la matriz subyacente lo retendrá al añadir).
Así que no entiendo el uso del retener / AutoRelease aquí ...
Solución
Vamos a suponer top
se vería así:
- (id) top {
return [stack lastObject];
}
Luego imagina esto:
foo = [bar top];
[bar removeAllObjects];
// Do something with foo
La siguiente ocurriría: La segunda línea haría que la retienen contar gota a 0, y en la tercera línea de foo
apuntaría a la memoria desasignado. Pero con la retain
y autorelease
la retienen contador es 1, hasta la piscina se vacía por tanto, en la tercera línea de foo
haría siguen apuntando a un objeto válido.