Atributos de establecedor de propiedad débiles y fuertes en Objective-C

¿Cuál es la diferencia entre los atributos de establecimiento de propiedad 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 weak no está disponible en iOS 4 y necesitamos usar assign.

¿Es débil similar a asignar?

Usted tiene ARC activado o desactivado para un archivo en particular. Si está autorelease no puede usar la función de release autorelease etc. En su lugar, usa strong weak para las propiedades o __strong __weak para las variables (por defecto es __strong ). Fuerte es el equivalente a retener, sin embargo, ARC administrará la liberación por usted.

El único momento en que desearía usar weak, es si desea evitar 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 ‘puente libre de peaje’ (conversión de NS a CF ) es un poco complicado. Aún debe administrar manualmente CFRelease() y CFRetain() para objetos CF. Cuando los convierte de nuevo en objetos NS, tiene que decirle al comstackdor sobre el conteo retenido para que sepa lo que ha hecho.

Todo está aquí .

Aquí hay información de lo que sé sobre las propiedades de las variables

  1. atómico // predeterminado
  2. no atómico
  3. fuerte = retener // predeterminado
  4. débiles
  5. conservar
  6. asignar // por defecto
  7. inseguro_unretenido
  8. dupdo
  9. solo lectura
  10. readwrite // predeterminado

así que debajo está el enlace detallado del artículo donde puedes encontrar todos los atributos mencionados anteriormente, que definitivamente te ayudarán. ¡Muchas gracias a todas las personas que dan mejores respuestas aquí!

Atributos o atributos de propiedades variables en iOS

01. strong (iOS4 = retener) – dice “mantén esto en el montón hasta que ya no lo apunte más” – en otras palabras, “soy el propietario, no puedes destrabarlo antes de apuntar bien con lo mismo que retener” “- Usas fuerte solo si necesitas retener el objeto. – Por defecto, todas las variables de instancia y las variables locales son indicadores fuertes. – Generalmente utilizamos strong para UIViewControllers (padres del elemento UI) – strong se usa con ARC y básicamente lo ayuda, al no tener que preocuparse por el conteo retenido de un objeto. ARC lo libera automáticamente cuando haya terminado con eso. Usar la palabra clave fuerte significa que usted es el propietario del objeto.

Ejemplo:

 @property (strong, nonatomic) ViewController *viewController; @synthesize viewController; 

02. weak (iOS4 = unsafe_unretained) – dice “mantener esto mientras alguien más lo apunte con fuerza” – lo mismo que asignar, no retener o liberar – Una referencia “débil” es una referencia que no se retiene. – Generalmente utilizamos weak para IBOutlets (UIViewController’s Childs). Esto funciona porque el objeto hijo solo necesita existir mientras el objeto principal lo haga. – una referencia débil es una referencia que no protege el objeto referenciado de la recolección por un recolector de basura. – Débil es esencialmente asignar, una propiedad no retenida. Excepto cuando el objeto está desasignado, el puntero débil se establece automáticamente en cero

Ejemplo:

 @property (weak, nonatomic) IBOutlet UIButton *myButton; @synthesize myButton; 

Explique : Gracias a BJ Homer

Imagina que nuestro objeto es un perro, y que el perro quiere huir (ser desasignado). Los indicadores fuertes son como una correa en el perro. Mientras tengas la correa unida al perro, el perro no huirá. Si cinco personas unen su correa a un perro, (cinco punteros fuertes a un objeto), entonces el perro no escapará hasta que las cinco correas estén sueltas. Los indicadores débiles, por otro lado, son como niños pequeños que señalan al perro y dicen “¡Mira, un perro!” Mientras el perro siga con la correa, los niños pequeños aún pueden ver al perro, y aún así lo señalarán. Sin embargo, tan pronto como todas las correas se separan, el perro huye sin importar cuántos niños pequeños lo señalen. Tan pronto como el último puntero fuerte (correa) ya no apunta a un objeto, el objeto será desasignado, y todos los punteros débiles se pondrán a cero. Cuando usamos débil? El único momento en que desearía usar weak, es si desea evitar 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).

Para llamar a las partes de los documentos a los que Robert hace referencia que responden explícitamente a sus dos últimas preguntas:

 // The following declaration is similar to "@property(assign) MyClass *myObject;" // except that if the MyClass instance is deallocated, // the property value is set to nil instead of remaining as a dangling pointer. @property(weak) MyClass *myObject; 

Esto se conoce como referencia débil de reducción a cero. Puede crear referencias débiles que no estén poniendo a cero referencias débiles usando __unsafe_unretained, pero como su nombre lo indica, generalmente no se recomienda.

También en los documentos:

 Weak references are not supported in Mac OS X v10.6 and iOS 4. 

El uso transparente de la propiedad DÉBIL es el siguiente:

 Any control whose properties we need to change(eg:text of a label) is declared weak and as below: @property(nonatomic,weak) IBOutlet Type *name; Eg: @property(nonatomic,weak) IBOutlet UILabel *myLabel; 

tomemos un ejemplo para elaborar más (la respuesta anterior ya es excelente), este ejemplo ayuda un poco más

vamos a tener dos clases A y B

 //Ah #import  #import "Bh" @interface A : NSObject @property (nonatomic, strong) B *objB; @end @implementation A // @end //Bh #import  #import "Ah" @interface B : NSObject @property strong text(nonatomic, strong) A *objA; @end @implementation B // @end and in main #import "Bh" #import "Ah" { A *obja =[[A alloc]init]; B *objb =[[B alloc]init]; A.objB=objb; B.objA=obja; } 

el código anterior generará un ciclo de retención porque ambos son del tipo fuerte a ——–> b ———> a

así que para evitarlo debes usar la propiedad de semana de uno de ellos para que se refiera semanalmente al objeto y no aumente el recuento de referencias.