Ejemplo de código: ¿Por qué todavía puedo acceder a este objeto NSString después de haberlo liberado?

Solo estaba escribiendo un código exploratorio para solidificar mi comprensión de Objective-C y encontré este ejemplo que no entiendo. Defino este método y ejecuto el código:

- (NSString *)stringMethod
{
    NSString *stringPointer = [[NSString alloc] initWithFormat:@"string inside stringPointer"];
    [stringPointer release];
    [stringPointer release];
    NSLog(@"retain count of stringPointer is %i", [stringPointer retainCount]);
    return stringPointer;
}

Después de ejecutar el código y llamar a este método, observo algunas cosas:

Normalmente, si intento acceder a algo que supuestamente se ha desasignado después de alcanzar el cero, se produce un error EXC_BAD_ACCESS. Aquí, obtengo un error "doble libre" de malloc en su lugar. ¿Porqué es eso?

No importa cuántas líneas de "[stringPointer release]" agrego al código, NSLog reporta un conteo retenido de 1. Cuando agrego más lanzamientos, obtengo más errores "doble gratis". ¿Por qué las declaraciones de liberación no funcionan como se espera?

A pesar de que publiqué por más tiempo stringPointer y recibí un montón de errores "doble libre", el valor de retorno todavía funciona como si no hubiera pasado nada (tengo otro NSLog en el código principal que informa el valor de retorno). El programa continúa ejecutándose normalmente. Una vez más, ¿alguien puede explicar por qué sucede esto?

Estos ejemplos son bastante triviales, pero estoy tratando de comprender lo que está pasando. ¡Gracias!

Respuestas a la pregunta(3)

Su respuesta a la pregunta