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.
- atómico // predeterminado
- no atómico
- fuerte = retener // por defecto
- débil = unsafe_unretained
- conservar
- asignar // predeterminado
- unsafe_unretained
- dupdo
- solo lectura
- 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í !!
- 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;
- 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.