ios objective-c iphone nsstring retain

ios - Objective-C 101(conservar vs asignar) NSString



iphone retain (8)

¿Sería desafortunado si su clase tuviera este objeto de cadena y luego desapareciera de debajo de él? Ya sabes, como la segunda vez que tu clase menciona ese objeto, ¿ha sido desasignado por otro objeto?

Es por eso que desea utilizar la semántica de retain .

Una pregunta 101

Digamos que estoy haciendo una base de datos de automóviles y cada objeto de automóvil se define como:

#import <UIKit/UIKit.h> @interface Car:NSObject{ NSString *name; } @property(nonatomic, retain) NSString *name;

¿Por qué es @property(nonatomic, retain) NSString *name; y no @property(nonatomic, assign) NSString *name; ?

Entiendo que la assign no incrementará el contador de referencia como lo hará la retain . Pero, ¿por qué utilizar retain , dado que name es un miembro del objeto de todo su alcance es para sí mismo?

Ninguna otra función externa lo modificará tampoco.


Después de leer tantos artículos, las publicaciones de SO y las aplicaciones de demostración creadas para comprobar los atributos de las propiedades variables, decidí unir toda la información de los atributos.

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

a continuación se encuentra el enlace detallado del artículo 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í !!

Atributos de propiedad variable o modificadores en iOS

  1. retener = fuerte
    • se retiene, el valor antiguo se libera y se asigna
    • retener especifica que el nuevo valor debe enviarse, retener en la asignación y el valor antiguo enviado, liberar
    • Mantener es lo mismo que fuerte.
    • Apple dice que si escribes retener, se convertirá automáticamente / solo funcionará como fuerte.
    • Los métodos como "alloc" incluyen una "retención" implícita

Ejemplo:

@property (nonatomic, retain) NSString *name; @synthesize name;

  1. asignar
    • asignar es el valor predeterminado y simplemente realiza una asignación de variable
    • asignar es un atributo de propiedad que le dice al compilador cómo sintetizar la implementación del definidor de la propiedad
    • Yo usaría asignar para propiedades primitivas C y débil para referencias débiles a objetos Objective-C.

Ejemplo:

@property (nonatomic, assign) NSString *address; @synthesize address;


El self. en:

self.name = something;

¡es importante! Sin él, está accediendo a la variable directamente y omitiendo el configurador.

El estilo más antiguo (corrígeme si me equivoco) habría sido:

[self setName:something];

De todos modos, esta notación fue el consejo (que suena vagamente familiar) que realmente necesitaba cuando @properties adecuadas en NSStrings . Gracias Axel.


La Guía de estilo de Objective-C de Google cubre esto bastante bien:

Los instaladores que toman una NSString, siempre deben copiar la cadena que acepta. Nunca solo retengan la cuerda. Esto evita que la persona que llama lo cambie debajo de usted sin su conocimiento. No asuma que, debido a que acepta una NSString, en realidad no es una NSMutableString.


No hay tal cosa como el "alcance de un objeto" en Objective-C. Las reglas de alcance no tienen nada que ver con la vida útil de un objeto: la cuenta de retención es todo.

Por lo general, debe reclamar la propiedad de sus variables de instancia. Ver las reglas de gestión de memoria de Objective-C . Con una propiedad retain , su creador de propiedades reclama la propiedad del nuevo valor y renuncia a la propiedad del anterior. Con una propiedad assign , el código circundante tiene que hacer esto, lo cual es tan complicado en términos de responsabilidades y separación de preocupaciones. La razón por la que utilizaría una propiedad de assign es en un caso en el que no puede retener el valor (como los tipos que no son objetos, como BOOL o NSRect) o al retenerlo podría causar efectos secundarios no deseados.

Por cierto, en el caso de una NSString, el tipo correcto de propiedad suele ser la copy . De esa manera, no puede cambiar de debajo de usted si alguien pasa en un NSMutableString (que es válido, es un tipo de NSString).


Para aquellos que lo buscan, la documentación de Apple sobre los atributos de las propiedades está here .


Sin retain no hay garantía de que el NSString* que está configurando el name vivirá por más tiempo que la propia declaración de asignación. Al usar la propiedad de retain para el configurador sintetizado, le está permitiendo al sistema de administración de memoria que haya al menos un objeto más interesado en mantener el NSString* alrededor.


y no olvides acceder a través de

self.name = something;

porque

name = something;

no se preocupará por los métodos generadores / definidores generados, sino que asignará el valor directamente.