¿Cuál es la diferencia entre fuerte, retener, no atómico, etc. en la propiedad Objective-C (iOS)?

He hecho un poco de trabajo con iOS, por lo que podría cubrir los conceptos básicos. Ayuda fuerte y débil con ciclos de retención de liberación (RRC), una forma de pérdida de memoria. iOS usa algo llamado Conteo automático de referencia (ARC) para saber cuándo un objeto está en uso y debe mantenerse en la memoria, o ya no está en uso y debe eliminarse para recuperar recursos. ARC funciona porque el tiempo de ejecución sabe para cada objeto cuántos objetos lo están haciendo referencia. Cuando eso encontrado llega a 0, el objeto se elimina.

Los problemas surgen cuando tiene dos objetos que contienen referencias entre sí. Debido a que el objeto A contiene una referencia al objeto B, y B a A, el recuento de referencia para A y B nunca será 0, este A y B siempre estarán en la memoria. También es posible que no haya otros objetos con referencias a A o B, por lo que acabamos de crear una pérdida de memoria.

Volviendo a Fuerte y Débil, estas palabras clave se utilizan para “denotar la propiedad”, por así decirlo. Le ayudan a eliminar los ciclos de retención y liberación al limitar qué objetos incrementan el recuento de referencia para otro objeto. Una propiedad fuerte es aquella en la que incrementa el recuento de referencia del objeto. Si el objeto A tiene una fuerte referencia a B, y ningún otro objeto hace referencia a B, B tiene el recuento 1 (A posee o necesita existir B). Ahora, si B quiere tener una referencia a A, nos gustaría usar una referencia débil . Las referencias débiles no incrementan el recuento de referencias del objeto. Entonces, en este caso particular, si A no tiene ningún otro objeto que lo haga referencia, excepto B, el recuento de A sería 0 dada la débil referencia de B.

¿Puedes ver cómo esto está eliminando el RRS? Suponiendo que no haya referencias externas y que no use referencias fuertes / débiles, A y B residirían perpetuamente en la memoria. Usando las referencias fuertes y débiles que describimos anteriormente, A tendría el recuento 0, por lo que se eliminaría de la memoria. Esto, a su vez, reduciría el recuento de referencias de B de 1 a 0, haciendo que B se elimine de la memoria.

Nonatomic se usa para denotar que el objeto al que se hace referencia no es seguro para subprocesos. Esto significa que el objeto no puede manejar múltiples solicitudes al mismo tiempo. La atomicidad es la idea de que una vez que realiza una solicitud, sucede o no. Cuando una operación es atómica, usted garantiza que la entidad a la que está aplicando la operación nunca estará en un estado intermedio . Independientemente de cómo se mire esa entidad, se ve de la misma forma que antes de solicitar la operación, o se ve de la misma manera una vez que se realiza la operación. (Al pensar en la atomicidad , piense en los átomos. La palabra significa indivisible. Las operaciones atómicas son aquellas que no se pueden dividir en operaciones más pequeñas).

¡Hay otros atributos de propiedad, esta página (http://rypress.com/tutorials/obj…) probablemente tenga una mejor explicación que la mía!


Antes de discutir sobre los atributos de @property, debe saber para qué sirve @property.

  • @property ofrece una manera de definir la información que una clase pretende encapsular. Si declara un objeto / variable usando @property , entonces ese objeto / variable será accesible para otras clases que importen su clase.
  • Si declara un objeto usando @property en el archivo de encabezado, debe sintetizarlo usando @synthesize en el archivo de implementación.

Ejemplo:

.h clase

      @interface ExampleClass: NSObject
     @property (no atómico, retener) NSString * nombre;
     @fin
    

    clase .m

      @implementation ExampleClass
     @ sintetizar nombre;
     @fin
    

    Ahora el compilador sintetizará métodos de acceso para el nombre .

      ExampleClass * newObject = [[Ejemplo de asignación de clase] init];
     NSString * name1 = [nombre del nuevo objeto];  // obtener 'nombre'
     [obj setName: @ "Tiger"];
    
    • Lista de atributos de @property:
    • atómico.
    • no atómico
    • conservar.
    • dupdo.
    • solo lectura.
    • leer escribir.
    • asignar.
    • fuerte.
    • atómico: es el comportamiento predeterminado. Si un objeto se declara como atómico, se vuelve seguro para subprocesos. Seguridad para subprocesos significa que, en un momento, solo un subproceso de una instancia particular de esa clase puede tener el control sobre ese objeto.

      Ejemplo: 
     @property NSString * nombre;  // por defecto atómico
     @property (atomic) NSString * name;  // explícitamente declarado atómico 

    • no atómico: no es seguro para subprocesos. Puede usar el atributo de propiedad no atómica para especificar que los accesos sintetizados simplemente establecen o devuelven un valor directamente, sin garantías sobre lo que sucede si se accede a ese mismo valor simultáneamente desde diferentes hilos. Por esta razón, es más rápido acceder a una propiedad no atómica que a una atómica.

    @property (nonatomic) NSString * name;

    • retener: se requiere cuando el atributo es un puntero a un objeto. El método de establecimiento aumentará el recuento de retención del objeto, de modo que ocupará memoria en el grupo de liberación automática.

    @property (conservar) NSString * nombre;

    • copia: si usa copia, no puede usar retener. El uso de la instancia de copia de la clase contendrá su propia copia.

    Incluso si se establece una cadena mutable y se modifica posteriormente, la instancia captura cualquier valor que tenga en el momento en que se establece. No se sintetizarán métodos setter y getter.

      @property (copia) NSString * nombre;
    
     NSMutableString * nameString = [NSMutableString stringWithString: @ "Liza"];    
     xyzObj.name = nameString;    
     [nameString appendString: @ "Pizza"]; 
    
    • solo lectura: si no desea permitir que se cambie la propiedad mediante el método setter, puede declarar la propiedad solo lectura.

    @property (readonly) NSString *name;

    • readwrite: es el comportamiento predeterminado. No necesita especificar el atributo readwrite explícitamente.

    @property (readwrite) NSString *name;

    • asignar: generará un setter que asigna el valor a la variable de instancia directamente, en lugar de copiarlo o retenerlo. Esto es mejor para tipos primitivos como NSInteger y CGFloat, u objetos que no son de su propiedad directamente, como los delegados.

    @property (assign) NSInteger year;

    • fuerte: es un reemplazo para retener.

    @property (nonatomic, strong) AVPlayer *player;

    • unsafe_unretained: hay algunas clases en Cocoa y Cocoa Touch que aún no admiten referencias débiles, lo que significa que no puede declarar una propiedad débil o una variable local débil para realizar un seguimiento de ellas. Estas clases incluyen NSTextView, NSFont y NSColorSpace, etc. Si necesita usar una referencia débil a una de estas clases, debe usar una referencia insegura.

    Una referencia insegura es similar a una referencia débil ya que no mantiene vivo su objeto relacionado, pero no se establecerá en nulo si el objeto de destino se desasigna.

    @property (unsafe_unretained) NSObject *unsafeProperty;

    No atómico
    nonatomic se utiliza para propósitos de subprocesamiento múltiple. Si hemos establecido el atributo no atómico en el momento de la declaración, cualquier otro hilo que desee acceder a ese objeto puede acceder a él y dar resultados con respecto al subprocesamiento múltiple.
    Dupdo
    Se requiere copia cuando el objeto es mutable. Use esto si necesita el valor del objeto tal como está en este momento, y no desea que ese valor refleje los cambios realizados por otros propietarios del objeto. Deberá liberar el objeto cuando haya terminado con él porque está reteniendo la copia.
    Asignar
    Asignar es algo opuesto a copiar. Al llamar al captador de una propiedad de asignación, devuelve una referencia a los datos reales. Por lo general, usa este atributo cuando tiene una propiedad de tipo primitivo (float, int, BOOL …)
    Conservar
    se requiere retener cuando el atributo es un puntero a un objeto. El setter generado por @synthesize retendrá (también conocido como agregar un conteo de retención) al objeto. Deberá liberar el objeto cuando haya terminado con él. Mediante el uso de retención, aumentará el recuento de retención y ocupará memoria en el grupo de liberación automática.
    Fuerte
    strong es un reemplazo para el atributo retener, como parte del Conteo de referencia automatizado (ARC) de Objective-C. En el código no ARC es solo un sinónimo de retener.
    Este es un buen sitio web para aprender sobre fuertes y débiles para iOS 5. http://www.raywenderlich.com/567
    Débiles
    débil es similar a fuerte, excepto que no aumentará el recuento de referencias en 1. No se convierte en propietario de ese objeto, sino que solo tiene una referencia a él. Si el recuento de referencia del objeto cae a 0, aunque todavía pueda estar apuntando a él aquí, se desasignará de la memoria.
    El enlace anterior contiene información buena con respecto a débil y fuerte.

    La palabra clave no atómica significa que los accesos sintetizados para esa propiedad no garantizan la integridad del objeto cuando se accede simultáneamente a través de subprocesos.

    La palabra clave atómica significa que los accesos sintetizados garantizan que el objeto esté completamente configurado o leído cuando se accede simultáneamente a través de subprocesos.

    Si usa la palabra clave atómica, esto no significa que su propiedad sea segura para subprocesos . Significa simplemente que se garantiza que el objeto esté completo. Todavía existe la posibilidad de que los datos en ese objeto estén obsoletos y desactualizados cuando se acceda simultáneamente a través de subprocesos.

    Según la documentación, una propiedad no atómica tendrá accesores sintetizados más eficaces en comparación con una propiedad atómica. La atomicidad del objeto garantizada por los accesos sintetizados de una propiedad atómica conlleva el costo de rendimiento de la contabilidad adicional en el tiempo de ejecución de Objective-C.

    La palabra clave fuerte implica la propiedad de la propiedad. Este es el valor predeterminado, por lo que no tiene que usar explícitamente la palabra clave si desea que la propiedad tenga una referencia fuerte. Si declara que una propiedad es fuerte, esa propiedad permanecerá en la memoria siempre que al menos un objeto tenga una referencia fuerte.

    La palabra clave débil no implica propiedad ni responsabilidad. Si declara que una propiedad es débil, se liberará si el objeto no tiene referencias fuertes. Asignar un objeto a una propiedad débil no aumenta el conteo de retención de ese objeto como lo haría si la propiedad fuera declarada como fuerte.

    Ejemplo de la vida real
    Fuerte: tienes un perro con una cadena en la mano
    Débil: Estás jugando con el perro desencadenado.

    Técnicamente
    Si alguna clase tiene un objeto fuerte, ese objeto nunca se eliminará de la memoria hasta que esa clase lo posea.

    Propiedad generalmente débil utilizada con IBOutlet. porque cuando la vista se elimina de la memoria, todos los objetos asociados con esa vista también deben eliminarse de la memoria.

    El atributo de propiedad 1-fuerte tiene control total sobre el objeto. Permanece una larga vida en la memoria, pero después de establecer nulo, libera memoria.
    El atributo de propiedad 2-débil no tiene control total sobre el objeto. Después del alcance variable, libera automáticamente la memoria.
    3-no atómico: no es seguro. múltiples hilos pueden acceder a un solo objeto a la vez. Es más rápido que el atómico.

    Gracias. Muy buena explicación.

    Grandes explicaciones. . .

    Estoy muy confundido en fuerte, débil.

    NUEVA YORK…..