Diferencias entre fuerte y débil en Objective-C

Resuelto Mark Pegasov asked hace 12 años • 9 respuestas

¿ Cuáles son las diferencias entre strongy weaken @propertylas declaraciones de punteros a objetos?

Además, ¿qué nonatomicsignifica?

Mark Pegasov avatar Jun 13 '12 18:06 Mark Pegasov
Aceptado

Puede resultar útil pensar en referencias fuertes y débiles en términos de globos.

Un globo no saldrá volando mientras al menos una persona esté sujeta a una cuerda atada a él. El número de personas que sostienen hilos es el recuento de retención. Cuando nadie se agarra a una cuerda, el globo se irá volando (dealloc). Muchas personas pueden tener hilos para ese mismo globo. Puede obtener/establecer propiedades y llamar a métodos en el objeto al que se hace referencia con referencias tanto fuertes como débiles.

Una referencia fuerte es como sujetar un hilo a ese globo. Mientras estés sujetando una cuerda atada al globo, este no saldrá volando.

Una referencia débil es como mirar el globo. Puedes verlo, acceder a sus propiedades, llamar a sus métodos, pero no tienes ninguna cadena para ese globo. Si todos los que sujetan la cuerda se sueltan, el globo se va volando y ya no podrás acceder a él.

MJN avatar Aug 20 '2013 21:08 MJN

Una referencia fuerte (que usará en la mayoría de los casos) significa que desea "poseer" el objeto al que hace referencia con esta propiedad/variable. El compilador se encargará de que cualquier objeto que asigne a esta propiedad no sea destruido siempre que lo señale con una referencia fuerte. Solo una vez que establezca la propiedad en, nilel objeto se destruirá (a menos que uno o más objetos también tengan una fuerte referencia a él).

Por el contrario, con una referencia débil significa que no desea tener control sobre la vida útil del objeto. El objeto al que hace referencia débilmente solo sigue vivo porque al menos otro objeto tiene una fuerte referencia a él. Una vez que ese ya no sea el caso, el objeto se destruirá y su propiedad débil se establecerá automáticamente en nil. Los casos de uso más frecuentes de referencias débiles en iOS son:

  1. delegar propiedades, a las que a menudo se hace referencia débilmente para evitar ciclos de retención, y

  2. subvistas/controles de la vista principal de un controlador de vista porque esas vistas ya están fuertemente controladas por la vista principal.

atómico versus no atómico se refiere a la seguridad de los subprocesos de los métodos getter y setter que el compilador sintetiza para la propiedad. atomic (el valor predeterminado) le dice al compilador que haga que los métodos de acceso sean seguros para subprocesos (agregando un bloqueo antes de acceder a un ivar) y noatomic hace lo contrario. La ventaja de los no atómicos es un rendimiento ligeramente mayor. En iOS, Apple utiliza no atómico para casi todas sus propiedades, por lo que el consejo general es que usted haga lo mismo.

Ole Begemann avatar Jun 13 '2012 11:06 Ole Begemann

fuerte : le asigna el valor entrante, retendrá el valor entrante y liberará el valor existente de la variable de instancia

débil : le asignará el valor entrante sin retenerlo.

Entonces la diferencia básica es la retención de la nueva variable. Generalmente desea conservarlo, pero hay situaciones en las que no desea tenerlo, de lo contrario obtendrá un ciclo de retención y no podrá liberar la memoria de los objetos. P.ej. obj1 retiene obj2 y obj2 retiene obj1. Para resolver este tipo de situaciones se utilizan referencias débiles.

Pfitz avatar Jun 13 '2012 11:06 Pfitz