359 votos

Objective-C ARC: fuerte vs retener y débil vs asignar

Hay dos nuevos de la memoria de gestión de los atributos de las propiedades introducidas por ARCO, strong y weak.

Aparte de copy, lo que obviamente es algo completamente diferente, ¿hay alguna diferencia entre los strong vs retain y weak vs assign?

Desde mi entender, la única diferencia aquí es que weak asignará nil para el puntero, mientras assign no, lo que significa que el programa se bloqueará al enviar un mensaje el puntero del ratón una vez que se ha liberado. Pero si utilizo weak, esto no va a suceder, porque el envío de mensajes para nil no hacer nada.

Yo no sé acerca de las diferencias entre strong y retain.

¿Hay alguna razón por la que debo usar assign y retain en nuevos proyectos, o son el tipo de ser despreciado?

596voto

RDC Puntos 9222

Después de leer tantos artículos de Stackoverflow puestos y demostración de las aplicaciones para comprobar la variable de la propiedad atributos, he decidido poner todos los atributos de la información:

  1. atomic //por defecto
  2. nonatomic
  3. fuerte=retener //por defecto
  4. débil
  5. conservar
  6. asignar //por defecto
  7. unsafe_unretained
  8. copia
  9. readonly
  10. readwrite //por defecto

A continuación está el artículo detallado enlace donde se puede encontrar mencionadas de todos los atributos, que sin duda le ayudará. Muchas gracias a todas las personas que dan mejores respuestas por aquí!!

La Variable de la propiedad de los atributos o Modificadores en iOS

1.strong (iOS4 = retener )

  • que dice "guardar esto en el montón hasta que yo no elija más"
  • en otras palabras, " soy el propietario, usted no puede dealloc esto antes de apuntar bien con la misma que se conserva"
  • Utilice fuerte sólo si usted necesita para retener el objeto.
  • Por defecto, todas las variables de instancia y variables locales son fuertes punteros.
  • Generalmente utilizamos fuerte para UIViewControllers (interfaz de usuario del elemento de padres)
  • fuerte se utiliza con ARCO y que básicamente ayuda a que , al no tener que preocuparse de conservar el recuento de un objeto. ARCO se libera de forma automática para usted cuando usted es hecho con it.Using la palabra clave fuerte significa que posee el objeto.

Ejemplo:

@property (strong, nonatomic) ViewController *viewController;

@synthesize viewController;

2.weak -

  • dice "mantener esto tan largo como alguien más puntos de fuerza"
  • la misma cosa que ceder, no retener o liberar
  • Una consideración "débil" de referencia es una referencia que no conserve.
  • Generalmente utilizamos débil para IBOutlets (UIViewController del Niño (a). Esto funciona porque el niño objeto sólo debe existir siempre como el objeto primario.
  • una débil referencia es una referencia que no protege la referencia de objeto de colección por un recolector de basura.
  • Débil es esencialmente asignar, de un bien inmueble. Excepto cuando el objeto se cancela la asignación de los débiles puntero se ajusta automáticamente a nil

Ejemplo :

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

@synthesize myButton;

Fuerte y Débil Explicación, Gracias a BJ Homero:

Imaginar nuestro objeto es un perro y que el perro quiere escapar (se se cancela la asignación).

Fuerte punteros son como una correa del perro. Como siempre que se tenga la correa atada al perro, el perro no va a huir. Si cinco personas conecte su correa a un perro, (de cinco en total punteros a un objeto), entonces, el perro no va a huir hasta que los cinco correas están separados.

Débil de los punteros, por otro lado, son como niños pequeños que apunta a la perro y diciendo : "¡Mira! Un perro!" Mientras el perro está todavía en el correa, que los niños pequeños se pueden todavía ver al perro, y que todavía punto . Tan pronto como todas las correas están separados, sin embargo, el perro corre distancia no importa cómo muchos niños pequeños se están apuntando a la misma.

Tan pronto como el último fuerte de puntero (correa) ya no apunta a un objeto, el objeto se cancela la asignación, y de todos los débiles punteros será ceros.

Cuando usamos débil?

El único momento en el que se desea utilizar débil, es que si usted quería evitar retener a los ciclos de (por ejemplo, el padre conserva el niño y el niño mantiene el padre por lo que tampoco es que se ha publicado).

3.retain = fuerte

  • se conserva, antiguo valor es el publicado y es asignado a retener especifica el nuevo valor debe ser enviado
  • conservar en la asignación y el valor antiguo enviado de liberación
  • retener es el mismo como fuerte.
  • apple dice que si usted escribe retener auto convertidos/trabajo como fuerte sólo.
  • métodos como el de "alloc" implícita una "retener"

Ejemplo:

@property (nonatomic, retain) NSString *name;

@synthesize name;

4.assign

  • asignar el valor por defecto y simplemente realiza una asignación de variable
  • asignar un atributo de la propiedad que le indica al compilador cómo sintetizar la propiedad del setter de la aplicación
  • Me gustaría utilizar para asignar C propiedades primitivas y débil para los débiles referencias a Objective-C objetos.

Ejemplo:

@property (nonatomic, assign) NSString *address;

@synthesize address;

228voto

JeremyP Puntos 46808

Desde la Transición a la ARC Notas de la Versión (en el ejemplo en la sección sobre los atributos de propiedad).

// The following declaration is a synonym for: @property(retain) MyClass *myObject;

@property(strong) MyClass *myObject;

Así, strong es el mismo como retain en una declaración de propiedad.

Para el ARCO proyectos usaría strong en lugar de retain, yo usaría assign C propiedades primitivas y weak para las referencias débiles a Objective-C objetos.

39voto

iMartin Puntos 4853

Que yo sepa, strong y retain son sinónimos, por lo que ellos hacen exactamente lo mismo.

A continuación, la weak es casi como assign, pero establece automáticamente a cero después de que el objeto, que está señalando, se cancela la asignación.

Eso significa que usted puede simplemente reemplazar ellos.

Sin embargo, hay un caso especial que he encontrado, donde tuve que usar assign, en lugar de weak. Digamos que tenemos dos propiedades delegateAssign y delegateWeak. En ambos se almacena nuestro delegado, que es dueño de nosotros por tener la única referencia fuerte. El delegado es la cancelación de la asignación, por lo que nuestro -dealloc método se llama también.

// Our delegate is deallocating and there is no other strong ref.
- (void)dealloc {
    [delegateWeak doSomething];
    [delegateAssign doSomething];
}

El delegado ya está en la desasignación de proceso, pero todavía no se ha desasignado. El problema es que weak referencias a él son ya anulada! Propiedad delegateWeak contiene nada, pero delegateAssign contiene el objeto válido (con todas las propiedades que ya han sido liberados y anulados, pero todavía válida).

// Our delegate is deallocating and there is no other strong ref.
- (void)dealloc {
    [delegateWeak doSomething]; // Does nothing, already nil.
    [delegateAssign doSomething]; // Successful call.
}

Es bastante caso especial, pero nos desvela cómo los weak de las variables de trabajo y cuando son anulados.

38voto

Vadoff Puntos 1506

nonatomic/atómica

  • nonatomic es mucho más rápido que atómica
  • utilice siempre nonatomic, a menos que usted tiene un requisito específico para atómica, que deben ser raras (atómica no garantiza la seguridad de los subprocesos - sólo a los puestos de acceso a la propiedad cuando, simultáneamente, se va a establecer por el otro hilo)

fuerte/débil/asignar

  • el uso fuerte para retener los objetos - aunque la palabra clave a retener es sinónimo, es mejor usar fuerte en vez
  • utilice débil si sólo desea un puntero al objeto sin retener - útil para evitar retener ciclos (es decir. los delegados) - automáticamente nulo el puntero cuando se libera el objeto
  • el uso de asignar para primatives - exactamente como débil la diferencia de que no nil el objeto cuando se libera

(Opcional)

copia

  • utilizarlo para crear una copia superficial del objeto
  • una buena práctica establecer siempre inmutable propiedades para copiar - porque mutable versiones se pueden pasar en inmutable propiedades, copiar asegurará de que usted siempre estará tratando con un objeto inmutable
  • si un objeto inmutable se pasa, se retendrá - si un objeto mutable se pasa, se hará una copia

readonly

  • utilizar para deshabilitar la configuración de la propiedad (previene el código de compilar si hay una infracción)
  • usted puede cambiar lo que es entregado por el captador cambiando la variable directamente a través de su variable de instancia o en el método getter propio

20voto

Flow Puntos 698

Clang del documento en Objective-C Automático de Conteo de referencias (ARC) explica la titularidad de los calificadores y los modificadores claramente:

Hay cuatro titularidad clasificados:

  • __autoreleasing
  • __fuerte
  • __*unsafe_unretained*
  • __débil

Un tipo es trivial propiedad-calificado si es calificado con __autoreleasing, __fuerte, o __débil.

Luego hay seis de la propiedad modificadores para declarado de la propiedad:

  • asignar implica __*unsafe_unretained* la propiedad.
  • copia implica __fuerte de la propiedad, así como el comportamiento habitual de copia de la semántica en la incubadora.
  • conservar implica __fuerte de la propiedad.
  • fuerte implica __fuerte de la propiedad.
  • *unsafe_unretained* implica __*unsafe_unretained* la propiedad.
  • débil implica __débil de la propiedad.

Con la excepción de los débiles, estos modificadores están disponibles en la no-ARCO modos.

La semántica sabio, la propiedad de los calificadores de tener un significado diferente en las cinco operaciones que se gestionan: la Lectura, la Asignación, la Inicialización, la Destrucción y de la Mudanza, en la que la mayoría de las veces que se preocupan sólo por la diferencia en la operación de Asignación.

La asignación se produce cuando la evaluación de un operador de asignación. El la semántica variar en función de la calificación:

  • Para __fuerte objetos, el nuevo pointee primero se conserva; en segundo lugar, el lvalue es cargado con la primitiva semántica; en tercer lugar, el nuevo pointee se almacena en el lvalue primitiva semántica; y finalmente, la vieja pointee es liberado. Esta no se realiza de forma atómica; la sincronización externa debe ser usado para hacer esta caja en el rostro de cargas simultáneas y tiendas.
  • Para __débil objetos, el lvalue se actualiza a punto para la nueva pointee, a menos que el nuevo pointee es un objeto actualmente en proceso de cancelación, en cuyo caso el lvalue se actualiza con un puntero null. Esto debe ejecutar de forma atómica con respecto a otras asignaciones para el objeto, a las lecturas del objeto, y a la versión final de la nueva pointee.
  • Para __*unsafe_unretained* los objetos, el nuevo pointee se almacena en el lvalue el uso de primitivas semánticas.
  • Para __autoreleasing objetos, el nuevo pointee se conserva, autoreleased, y se almacena en el lvalue el uso de primitivas semánticas.

La otra diferencia en la Lectura, Init, la Destrucción y de la Mudanza, por favor refiérase a la Sección 4.2 de la Semántica en el documento.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X