Como alguien nuevo en Objective-C, ¿alguien puede darme una visión general de la retención, asignación, copia y cualquier otra que me falte, que siga la directiva @property? ¿Qué están haciendo y por qué querría usar uno sobre otro?
Como alguien nuevo en Objective-C, ¿alguien puede darme una visión general de la retención, asignación, copia y cualquier otra que me falte, que siga la directiva @property? ¿Qué están haciendo y por qué querría usar uno sobre otro?
Respuestas:
El artículo vinculado a MrMage ya no funciona. Entonces, esto es lo que aprendí en mi (muy) breve codificación en Objective-C:
no atómico frente a atómico: "atómico" es el valor predeterminado. Utilice siempre "no atómico". No sé por qué, pero el libro que leí decía que "rara vez hay una razón" para usar "atómico". (Por cierto: el libro que leí es el libro "Programación iOS" de BNR).
readwrite vs. readonly - "readwrite" es el valor predeterminado. Cuando se sintetiza, se crearán un getter y un setter para usted. Si usa "solo lectura", no se creará ningún setter. Úselo para un valor que no quiera cambiar después de la instanciación del objeto.
retener vs. copiar vs. asignar
atomic
es tan malo como aconsejar nonatomic
. Ninguna de las opciones es la "correcta", por lo que los diseñadores de idiomas optaron por la más segura de las dos soluciones. De hecho, nonatomic
generalmente es la mejor opción, ya que omite bloqueos de rosca extremadamente caros. La única razón para usar atomic
es si su propiedad puede establecerse desde varios subprocesos (en cuyo caso, omitirla puede provocar una liberación excesiva o una fuga).
Antes de conocer los atributos de @property, debe saber para qué sirve @property.
@property ofrece una forma 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. Esto hace que el objeto sea compatible con KVC . Por defecto, el compilador sintetizará métodos de acceso para este objeto.
Los métodos de acceso son: setter y getter.
Ejemplo: .h
@interface XYZClass : NSObject
@property (nonatomic, retain) NSString *name;
@end
.metro
@implementation XYZClass
@synthesize name;
@end
Ahora el compilador sintetizará métodos de acceso para el nombre .
XYZClass *obj=[[XYZClass alloc]init];
NSString *name1=[obj name]; // get 'name'
[obj setName:@"liza"]; // first letter of 'name' becomes capital in setter method
Lista de atributos de @property
atómico, no atómico, retener, copiar, solo lectura, reescribir, asignar, fuerte, getter = método, setter = método, inseguro_retenido
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.
Si el hilo realiza el método getter, entonces otro hilo no puede realizar el método setter en ese objeto. Es lento.
@property NSString *name; //by default atomic`
@property (atomic)NSString *name; // explicitly declared atomic`
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;
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 (retain)NSString *name;
Incluso si se establece una cadena mutable y luego se cambia, la instancia captura cualquier valor que tenga en el momento en que se establece. No se sintetizarán métodos setter y getter.
@property (copy) NSString *name;
ahora,
NSMutableString *nameString = [NSMutableString stringWithString:@"Liza"];
xyzObj.name = nameString;
[nameString appendString:@"Pizza"];
el nombre no se verá afectado.
El compilador generará un getter, pero no un setter.
@property (readonly) NSString *name;
Es lo contrario de solo lectura.
@property (readwrite) NSString *name;
Tenga en cuenta que retener y asignar son básicamente intercambiables cuando la recolección de basura está habilitada.
@property (assign) NSInteger year;
Viene con ARC.
@property (nonatomic, strong) AVPlayer *player;
En el caso de las propiedades booleanas (propiedades que tienen un valor SÍ o NO), es habitual que el método getter comience con la palabra "es"
@property (getter=isFinished) BOOL finished;
El método debe terminar con dos puntos.
@property(setter = boolBool:) BOOL finished;
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;
Si necesita especificar varios atributos, simplemente inclúyalos como una lista separada por comas, como esta:
@property (readonly, getter=isFinished) BOOL finished;
@property
en el archivo de encabezado, entonces tienes que sintetizarlo usando@synthesize
en el archivo de implementación." No siempre. Por ejemplo, "Por defecto, una readwrite
propiedad estará respaldada por una variable de instancia, que nuevamente será sintetizada automáticamente por el compilador". De doc .
Después de leer muchos artículos, decidí reunir toda la información de los atributos:
- atómico // predeterminado
- no atómico
- fuerte = retener // predeterminado
- débil = inseguro_reretenido
- conservar
- asignar // predeterminado
- inseguro_reretenido
- Copiar
- solo lectura
- readwrite // predeterminado
A continuación hay un enlace al artículo detallado donde puede encontrar estos atributos.
¡Muchas gracias a todas las personas que dan las mejores respuestas aquí!
Aquí está la descripción de muestra del artículo
Ejemplo:
@property (retain) NSString *name;
@synthesize name;
Ejemplo:
@property (nonatomic, retain) NSString *name;
@synthesize name;
Explique:
Suponga que hay una propiedad de cadena atómica llamada "nombre", y si llama a [self setName: @ "A"] desde el hilo A, llame a [self setName: @ "B"] desde el hilo B y llame a [self name] desde subproceso C, todas las operaciones en subprocesos diferentes se realizarán en serie, lo que significa que si un subproceso está ejecutando setter o getter, otros subprocesos esperarán. Esto hace que la propiedad "nombre" lea / escriba de manera segura, pero si otro hilo D llama [liberación de nombre] simultáneamente, esta operación podría producir un bloqueo porque no hay una llamada de establecimiento / obtención involucrada aquí. Lo que significa que un objeto es seguro para lectura / escritura (ATOMIC) pero no para subprocesos, ya que otros subprocesos pueden enviar simultáneamente cualquier tipo de mensajes al objeto. El desarrollador debe garantizar la seguridad del hilo para dichos objetos.
Si la propiedad "nombre" no era atómica, entonces todos los hilos en el ejemplo anterior - A, B, C y D se ejecutarán simultáneamente produciendo cualquier resultado impredecible. En el caso de atómico, cualquiera de A, B o C se ejecutará primero pero D aún puede ejecutarse en paralelo.
Ejemplo:
@property (strong, nonatomic) ViewController *viewController;
@synthesize viewController;
Ejemplo:
@property (weak, nonatomic) IBOutlet UIButton *myButton;
@synthesize myButton;
Explicación fuerte y débil, gracias a BJ Homer :
Imagine que nuestro objeto es un perro, y que el perro quiere huir (ser desasignado). Punteros fuertes son como una correa en el perro. Mientras tenga la correa atada al perro, el perro no huirá. Si cinco personas atan su correa a un perro (cinco punteros fuertes a un objeto), entonces el perro no se escapará hasta que se quiten las cinco correas. Los indicadores débiles, por otro lado, son como niños pequeños apuntando al perro y diciendo "¡Mira! ¡Un perro!" Mientras el perro todavía esté con la correa, los niños pequeños aún pueden ver al perro y aún lo señalarán. Sin embargo, tan pronto como se sueltan todas las correas, el perro se escapa sin importar cuántos niños pequeños lo señalen. Tan pronto como el último puntero fuerte (correa) ya no apunte a un objeto, el objeto se desasignará y todos los punteros débiles se pondrán a cero. Cuando usamos débil? El único momento en que desearía usar débil, es si desea evitar retener ciclos (por ejemplo, el padre retiene al niño y el niño retiene al padre para que ninguno sea liberado).
Ejemplo:
@property (nonatomic, retain) NSString *name;
@synthesize name;
Ejemplo:
@property (nonatomic, assign) NSString *address;
@synthesize address;
inseguro_reretenido
-unsafe_unretained es un calificador de propiedad que le dice a ARC cómo insertar llamadas retener / liberar -unsafe_unretained es la versión ARC de asignar.
Ejemplo:
@property (nonatomic, unsafe_unretained) NSString *nickName;
@synthesize nickName;
Ejemplo:
@property (nonatomic, copy) NSArray *myArray;
@synthesize myArray;
Solo se puede acceder a la propiedad atómica a la vez. Es seguro para hilos . El valor predeterminado es atómico. Tenga en cuenta que no hay una palabra clave atómica
No atómico significa que varios subprocesos pueden acceder al elemento. No es seguro
Por lo tanto, debe tener mucho cuidado al usar atomic. Como afecta el rendimiento de su código
Prefiero estos enlaces sobre propiedades en Objective-C en iOS ...
https://techguy1996.blogspot.com/2020/02/properties-in-objective-c-ios.html