2010-10-15 14 views
7

Estoy buscando un código fuente abierto y tratando de entender por qué el autor ha hecho algo de una manera particular.¿Cuál es el punto en un retener inmediatamente seguido de una liberación automática?

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 de la pila y su aplicación es:

- (id)top { 
    return [[[stack lastObject] retain] autorelease]; // stack is an instance of NSMutableArray 
} 

¿Qué pasa con el retener seguido de una liberación automática inmediata?

Mi reacción inicial fue que esto evitaría que un analizador advirtiera sobre una pérdida de memoria, pero analicé sin la retención/liberación automática y todavía no había ninguna advertencia.

Al observar el ciclo de vida, un objeto se crearía, se empujaría a la pila y se liberaría, por lo que la pila posee el objeto (la matriz subyacente lo retendrá al agregarlo).

Así que no entienden el uso del retener/autorelease aquí ...

Respuesta

9

Asumamos top se vería así:

- (id) top { 
    return [stack lastObject]; 
} 

Luego imagina esto:

foo = [bar top]; 
[bar removeAllObjects]; 
// Do something with foo 

Ocurriría lo siguiente: la segunda línea haría que el recuento de retener descendiera a 0, y en la tercera línea foo apuntaría a la memoria desasignada. Pero con el retain y autorelease el conteo de retención es 1, hasta que el grupo se vacíe, por lo tanto, en la tercera línea foo aún señalaría un objeto válido.

+0

Tiene sentido, gracias. – Jasarien

+4

Todavía no es correcto hacer eso. La Guía de programación de administración de memoria establece "Al igual que no debe preocuparse por el recuento de retención real de un objeto, no debería preocuparse si un objeto devuelto a usted se libera automáticamente o no. La única preocupación es si usted es el propietario o no. no." - por lo que la retención de retención + debería ocurrir en el foo = [barra superior]; línea, no en el método - (id) top {}. –

+0

Bien explicada respuesta. –

Cuestiones relacionadas