¿Cuál es la diferencia entre los atributos de establecimiento de propiedades débiles y fuertes en Objective-C?
@property(retain, [weak/strong]) __attribute__((NSObject)) CFDictionaryRef myDictionary;
¿Cuál es el impacto y el beneficio?
Escuché que débil no está disponible en iOS 4 y necesitamos usar asignar.
¿Es débil similar a asignar?
Respuestas:
Tiene ARC activado o desactivado para un archivo en particular. Si está activado, no puede usar,
retain
release
autorelease
etc. En su lugar, usestrong
weak
para propiedades o__strong
__weak
variables (predeterminado en__strong
). Fuerte es el equivalente a retener, sin embargo, ARC gestionará el lanzamiento por usted.La única vez que querría usar débil es si desea evitar los ciclos de retención (por ejemplo, el padre retiene al hijo y el hijo retiene al padre, por lo que ninguno de los dos se libera).
La parte de 'puenteo gratuito' (pasar de
NS
aCF
) es un poco complicada. Todavía tiene que administrar manualmenteCFRelease()
yCFRetain()
para los objetos CF. Cuando los vuelve a convertir en objetos NS, debe informar al compilador sobre el recuento de retención para que sepa lo que ha hecho.Todo está aquí .
fuente
Aquí hay información sobre lo que sé sobre propiedades variables.
así que a continuación está el enlace del artículo detallado donde puede encontrar todos los atributos mencionados anteriormente, que definitivamente lo ayudarán. ¡¡Muchas gracias a todas las personas que dan las mejores respuestas aquí !!
01. fuerte (iOS4 = retener) - dice "mantén esto en el montón hasta que ya no lo señale" - en otras palabras "Soy el propietario, no puedes desasignar esto antes de apuntar bien con lo mismo que retener "- Utilice fuerte solo si necesita retener el objeto. - De forma predeterminada, todas las variables de instancia y las variables locales son punteros fuertes. - Generalmente usamos strong para UIViewControllers (los padres del elemento UI) - strong se usa con ARC y básicamente te ayuda, al no tener que preocuparte por el recuento de retención de un objeto. ARC lo libera automáticamente para usted cuando haya terminado con él. Usar la palabra clave fuerte significa que usted es el propietario del objeto.
Ejemplo:
02. débil (iOS4 = unsafe_unretained) - dice "mantén esto mientras alguien más lo señale fuertemente" - lo mismo que asignar, no retener o liberar - Una referencia "débil" es una referencia que no retienes. - Generalmente usamos débil para IBOutlets (Childs de UIViewController). Esto funciona porque el objeto hijo solo necesita existir mientras el objeto padre lo haga. - una referencia débil es una referencia que no protege el objeto referenciado de la recolección por parte de un recolector de basura. - Débil es esencialmente asignar, una propiedad no retenida. Excepto cuando el objeto se desasigna, el puntero débil se establece automáticamente en cero
Ejemplo:
Explique : Gracias a BJ Homer
Imagine que nuestro objeto es un perro y que el perro quiere huir (ser desasignado). Los punteros 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 siga 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. ¿Cuándo usamos débil? La única vez que querría usar débil es si desea evitar los ciclos de retención (por ejemplo, el padre retiene al hijo y el hijo retiene al padre, por lo que ninguno de los dos se libera).
fuente
strong=retain
yassign
etiquetados como predeterminados, pero no puede ser ambos.weak
ystrong
en tus ejemplos. ¿No tendría más sentido que un padre tengastrong
referencias a sus hijos (como lamyButton
propiedad de laUIViewController
clase que ha demostrado serweak
) y que los hijos mantenganweak
referencias a su padre (como laviewController
propiedad de una clase secundaria que usted ' en su lugar, lo configuró enstrong
). Por ejemplo, al leer Matt NeuburgiOS 7 Programming Fundamentals
, muestra que una clase que declara a su delegado como una propiedad la mantendrá `débil, eso parece justo.Para mencionar las partes de los documentos a los que hace referencia Robert que responden sus dos últimas preguntas explícitamente:
Esto se conoce como referencia débil de reducción a cero. Puede crear referencias débiles que no pongan a cero las referencias débiles utilizando __unsafe_unretained, pero como su nombre lo indica, esto generalmente no se recomienda.
También en los documentos:
fuente
__unsafe_unretained
es la versión ARC deassign
.El uso cristalino de la propiedad DÉBIL es el siguiente:
fuente
tomemos un ejemplo para elaborar más (las respuestas anteriores ya son geniales), que este ejemplo ayude un poco más
tengamos dos clases A y B
el código anterior generará un ciclo de retención porque ambos son del tipo fuerte a --------> b ---------> a
por lo que para evitarlo, debe usar la propiedad week de uno de ellos para que se refiera semanalmente al objeto y no aumente el recuento de referencias.
fuente