¿Por qué se agregará un object débil a pool de autorelease?

id __weak obj1 = obj0; 

iguales

 id __weak obj1 = obj0; id __autoreleasing tmp = obj0; 

En Pro multithreading y gestión de memory para iOS y OSX .

Pero por qué el obj1 debe agregarse al grupo de autorelease, creo que hacer un puntero débil de un object no debe afectar su vida.

 { NSObject* sp = [NSObject new]; NSObject* __weak wp = sp; } 

el código anterior se traduce a:

 id sp = objc_msgSend(NSObject, "new"); id wp; objc_initWeak(&wp, sp); objc_destroyWeak(&wp); objc_storeStrong(&sp, 0); 

1) obj_initWeak simplemente asocia el puntero débil wp con el puntero fuerte sp para asegurar que cuando el object señalado por sp se desalinea wp se restablece automáticamente a nil, lo que no significaría el recuento de retención del object puntiagudo.
2) obj_destroyWeak destruye la asociación del puntero débil y el puntero fuerte.
3) obj_storeStrong en la última instrucción igual a [sp release] .

Pero tan pronto como usamos el puntero débil, el comstackdor generaría una nueva reference para el object apuntado.

 { NSObject* sp = [NSObject new]; NSObject* __weak wp = sp; NSLog(@"%@", wp); } 

se convierte

 id sp = objc_msgSend(NSObject, "new"); id wp; objc_initWeak(&wp, sp); id tmp = objc_loadWeakRetained(wp); NSLog(@"%@", wp); objc_release(tmp); objc_destroyWeak(&wp); objc_storeStrong(&sp, 0); 

objc_loadWeakRetained incrementaría el recuento de references para garantizar que tmp esté vivo en la instrucción NSLog . objc_release restablecer el object al estado original.

En conclusión, este layout de __weak asegura que durante el uso de puntero débil, su estado sea consistente. La nueva implementación de __weak de Apple LLVM version 8.0.0 (clang-800.0.42.1) no pospone el lanzamiento a autoreleasepool , sino que usa objc_release directamente.

    Intereting Posts