¿Por qué retener el recuento es diferente en el modo de depuración y en el modo de ejecución?

Sé cómo funcionan ARC y MRC. pero estoy confundido al probar el siguiente código. No sé por qué sucede esto. ¿Por qué el conteo de retención es diferente en el modo de depuración y en el modo de ejecución para la misma pregunta?

    NSMutableArray *a = [NSMutableArray array];
    [a addObject:@"abc"];
    NSLog(@" 1 Retain count is %ld", CFGetRetainCount((__bridge CFTypeRef)a));
    __weak  NSMutableArray *b = a;
    NSLog(@" 2 Retain count is %ld", CFGetRetainCount((__bridge CFTypeRef)a));
    a = nil;
    NSLog(@" 3 Retain count is %ld", CFGetRetainCount((__bridge CFTypeRef)b));
    [b addObject:@"xys"];
    NSLog(@" 4 Retain count is %ld", CFGetRetainCount((__bridge CFTypeRef)b));

Cuando ejecuto la aplicación en modo de ejecución, la aplicación se bloquea en líneaNSLog(@" 3 Retain count is %ld", CFGetRetainCount((__bridge CFTypeRef)b)); que entiendo como es la bweak referencia de a. y objetar una liberación cuando se asignanil lo. pero antes de eso si muestra la salida de las dos primeras líneas como la imagen de abajo. Lo cual también es correcto.

Pero cuando la aplicación está en modo de depuración (significa que hemos establecido el punto de interrupción y la depuración), la aplicación no se bloqueó y también muestra el recuento de retención 2 en cada línea. como la imagen de abajo.

¿Alguien tiene idea de por qué sucede esto? ¿Por qué el mismo código da dos valores de retención diferentes para un modo diferente?

Respuestas a la pregunta(1)

Su respuesta a la pregunta