Soy nuevo en el desarrollo de iOS5 y uso objetivo-c. Tengo problemas para entender la diferencia entre almacenamiento fuerte y débil . He leído la documentación y otras preguntas de SO, pero todas me suenan idénticas sin más información.
Leí la documentación: Transición a ARC : hace referencia a los términos de retención, asignación y publicación de iOS4; lo que me confunde. Luego miro a Open U CS193p, donde diferencia lo fuerte y lo débil:
Fuerte : "mantén esto en el montón hasta que ya no lo señale"
Débil : "mantén esto mientras alguien más lo señale con fuerza"
¿No son las dos definiciones idénticas = si el puntero ya no apunta a un objeto, entonces libera la memoria que contiene el objeto? Entiendo el concepto de punteros, montón, asignación o desasignación de memoria, pero ¿cuál es la diferencia entre fuerte y débil?
Respuestas:
La diferencia es que un objeto se desasignará tan pronto como no haya indicadores sólidos hacia él. Incluso si los punteros débiles apuntan a él, una vez que el último puntero fuerte desaparezca, el objeto se desasignará y todos los punteros débiles restantes se pondrán a cero.
Quizás un ejemplo sea apropiado.
Imagine que nuestro objeto es un perro y que el perro quiere huir (ser desasignado).
Los indicadores fuertes son como una correa para el perro. Mientras tenga la correa atada al perro, el perro no huirá. Si cinco personas atan su correa a un perro (cinco punteros fuertes a un objeto), entonces el perro no se escapará hasta que las cinco correas estén sueltas.
Los punteros débiles, por otro lado, son como niños pequeños señalando al perro y diciendo "¡Mira! ¡Un perro!" Mientras el perro todavía esté con la correa, los niños pequeños aún pueden ver al perro y aún lo señalarán. Sin embargo, tan pronto como se quitan todas las correas, el perro huye sin importar cuántos niños pequeños lo señalen.
Tan pronto como el último puntero fuerte (correa) ya no apunte a un objeto, el objeto se desasignará y todos los punteros débiles se pondrán a cero.
fuente
Absolutamente no. La diferencia clave en las dos definiciones que ha señalado es "siempre que alguien más". Es el "otro" lo que es importante.
Considera lo siguiente:
Ahora tenemos dos punteros para
<some_object>
, uno fuerte y otro débil. Si nos fijamosstrongObject
ennil
este modo:Luego, si sigue las reglas que describió, se hará estas preguntas:
Fuerte: "mantén esto en el montón hasta que ya no lo señale"
strongObject
no apunta a<some_object>
más. Entonces no necesitamos quedárnoslo.Débil: "mantén esto mientras alguien más lo señale con firmeza"
weakObject
todavía apunta a<some_object>
. Pero como nadie más lo señala, esta regla también significa que no es necesario que la cumplamos.El resultado es que
<some_object>
se desasigna y si su tiempo de ejecución lo admite (Lion e iOS 5 en adelante)weakObject
, se configurará automáticamente ennil
.Ahora considere lo que sucede si nos fijamos
weakObject
anil
este modo:Luego, si sigue las reglas que describió, se hará estas preguntas:
Fuerte: "mantén esto en el montón hasta que ya no lo señale"
strongObject
apunta a<some_object>
. Así que necesitamos mantenerlo.Débil: "mantén esto mientras alguien más lo señale con firmeza"
weakObject
no apunta a<some_object>
.El resultado es que
<some_object>
se no se cancela la asignación, peroweakObject
será elnil
puntero.[Tenga en cuenta que todo lo que se supone
<some_object>
no está señalado por otra fuerte referencia en otro lugar / algún otro medio de ser "retenido"]fuente
UIApplication
objeto? Eso será fuertemente referenciado por el funcionamiento interno deUIKit
, pero no necesita preocuparse por eso.Fuerte
Débiles
fuente
Otro ejemplo: El estudiante es un
Object
, se supone que puede graduarse (deallocate
) siempre que haya terminado todos los cursos básicos (strong pointers
), sin importar si toma cursos opcionales (weak pointers
). En otras palabras: un puntero fuerte es el único factor de desasignación de esoObject
.fuente
No, no son idénticos sino muy diferentes. Use fuerte solo si necesita retener el objeto. Se usa débil en cualquier otro caso, con la ventaja de que puede saber si el objeto se ha eliminado del montón porque nadie lo retiene.
fuente
Sé que llego bastante tarde a esta fiesta, pero creo que es importante confundir el tema señalando que el significado de "modelos de memoria fuerte y débil" depende de si se habla de software o hardware.
Para hardware, débil o fuerte indica si hay soporte para la coherencia secuencial.
WTF, ¿eso tiene que ver con la memoria? Implica que las escrituras en variables de diferentes procesadores deben ser vistas en el mismo orden por todos los procesadores. En hardware con un modelo fuerte esto está garantizado. En hardware con un modelo débil, no lo es.
Las respuestas existentes interpretan la pregunta solo en términos de modelos de memoria de software. El hardware no es irrelevante para la programación. Esta misma pregunta menciona iOS, que normalmente se ejecuta en procesadores Arm7. Arm7 tiene un modelo de memoria débil. Para los programadores acostumbrados a procesadores con un modelo sólido, que somos todos porque x86 y x64 tienen un modelo sólido, esta es una trampa terrible. Usar un bool para señalar a otro hilo para salir funciona bien en un modelo fuerte. El mismo código en Arm no funciona en absoluto a menos que marque la bandera como volátil, e incluso entonces es errático.
Si bien es cierto que Arm8 + cambia esto por completo con soporte explícito para adquisición / lanzamiento, el software heredado no usa este soporte. El software heredado incluye los tres sistemas operativos del teléfono y todo lo que se ejecuta en ellos, así como compiladores y bibliotecas hasta que se actualizan.
Para un examen más extenso de este tema, le remito al inimitable Herb Sutter .
fuente