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í ...

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top