objective-c clang automatic-ref-counting weak-references dealloc

objective c - ¿Por qué la configuración de un objeto que está pasando por una desasignación a un resultado de propiedad débil se bloquea?



objective-c clang (1)

No es un error: obviamente es muy intencional. Es una desviación de la especificación, pero es una intencional.

Según la advertencia, parece que querían facilitar el diagnóstico de los escenarios de liberación excesiva, y la captura de objetos que se están desasignando en ese momento podría ser un efecto secundario de ese objetivo principal.

También pueden considerar eso, si estás tratando de debilitarte a ti self mientras estás siendo desasignado de todos modos, y no estás comprobando si hay un valor débil débil (bastante común: ¡muchas veces el código de bloqueo llama a través de un filtro débil que podría fallar en cualquier momento! ), te estás preparando para errores difíciles de depurar.

Dicho todo esto, me encantaría ver las notas detrás de ese cambio de tiempo de ejecución.

En el recuento automático de referencias de Objective-C de Clang vemos lo siguiente

Para __ objetos débiles, el valor de l se actualiza para apuntar al nuevo pointee, a menos que el nuevo pointee sea un objeto que se encuentre actualmente en reparto, en cuyo caso el valor de l se actualiza a un puntero nulo. Esto debe ejecutarse de forma atómica con respecto a otras asignaciones al objeto, a las lecturas del objeto y al lanzamiento final del nuevo pointee.

En objc-weak.mm vemos el siguiente fragmento de código en weak_register_no_lock() :

if (deallocating) { if (crashIfDeallocating) { _objc_fatal("Cannot form weak reference to instance (%p) of " "class %s. It is possible that this object was " "over-released, or is in the process of deallocation.", (void*)referent, object_getClassName((id)referent)); } else { return nil; } }

Establecí un punto de interrupción en mi método de UCIiewController subclass dealloc y traté de invocar [self allowsWeakReference] en lldb que resultó en NO valor.

Si intentamos establecer una propiedad débil de otro objeto, la aplicación se bloqueará de acuerdo con el código objc-weak.mm.

La pregunta es: ¿por qué sucede esto? ¿Es incorrecta la especificación del sonido? ¿Es este un error en la implementación de objc?

Aquí hay un simple fragmento de código que reproducirá la falla:

//cc -fmodules -fobjc-arc -g crash.m -o crash @import Foundation; @interface Foo : NSObject @end @implementation Foo - (void)dealloc { Foo * __weak weakSelf = self; // crashes on this line } @end int main() { (void)[[Foo alloc] init]; return 0; }