objective c - sistema - Diferencias entre fuerte y débil en Objective-C
swift lenguaje de programacion caracteristicas (9)
Aquí, la documentación de Apple ha explicado la diferencia entre propiedades débiles y fuertes mediante varios ejemplos:
Aquí, en este blog el autor ha recogido todas las propiedades en el mismo lugar. Ayudará a comparar las características de las propiedades:
http://rdcworld-iphone.blogspot.in/2012/12/variable-property-attributes-or.html
Soy nuevo en Obj-C, así que mi primera pregunta es:
¿Cuáles son las diferencias entre strong
y weak
en @property
declaraciones de @property
de punteros a objetos?
Además, ¿ nonatomic
significa no nonatomic
?
Para entender la referencia Fuerte y Débil, considere el siguiente ejemplo, supongamos que tenemos un método llamado como displayLocalVariable.
-(void)displayLocalVariable
{
NSString myName = @"ABC";
NSLog(@"My name is = %@", myName);
}
En el método anterior, el alcance de la variable myName se limita al método displayLocalVariable, una vez que el método finaliza, la variable myName que contiene la cadena "ABC" se desasignará de la memoria.
Y ahora, si queremos mantener el valor de la variable myName a lo largo de nuestro ciclo de vida del controlador de vista. Para esto, podemos crear la propiedad nombrada como nombre de usuario que tendrá una referencia fuerte a la variable myName (vea @property(nonatomic,strong) NSString* username;
y self.username = myName;
en el siguiente código), como se muestra a continuación,
@interface LoginViewController ()
@property(nonatomic,strong) NSString* username;
@property(nonatomic,weak) NSString* dummyName;
- (void)displayLocalVariable;
@end
@implementation LoginViewController
- (void)viewDidLoad
{
[super viewDidLoad];
}
-(void)viewWillAppear:(BOOL)animated
{
[self displayLocalVariable];
}
- (void)displayLocalVariable
{
NSString myName = @"ABC";
NSLog(@"My name is = %@", myName);
self.username = myName;
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
}
@end
Ahora, en el código anterior puede ver que myName se ha asignado a self.username y self.username tiene una referencia segura (como hemos declarado en la interfaz usando @property) a myName (indirectamente tiene una referencia fuerte a la cadena "ABC"). Por lo tanto, String myName no se desasignará de la memoria hasta que self.username esté vivo.
- Referencia débil
Ahora considere asignar myName a dummyName, que es una referencia débil, self.dummyName = myName; A diferencia de la referencia fuerte, Débil mantendrá mi nombre solo hasta que haya una referencia fuerte a mi nombre. Vea el código de abajo para entender la referencia débil,
-(void)displayLocalVariable
{
NSString myName = @"ABC";
NSLog(@"My name is = %@", myName);
self.dummyName = myName;
}
En el código anterior hay una referencia débil a myName (es decir, self.dummyName tiene una referencia débil a myName) pero no hay una referencia fuerte a myName, por lo que self.dummyName no podrá mantener el valor de myName.
Ahora nuevamente considere el siguiente código,
-(void)displayLocalVariable
{
NSString myName = @"ABC";
NSLog(@"My name is = %@", myName);
self.username = myName;
self.dummyName = myName;
}
En el código anterior, self.username tiene una referencia fuerte a myName, por lo que self.dummyName ahora tendrá un valor de myName incluso después de que el método termine, ya que myName tiene una referencia fuerte asociada.
Ahora, cuando hacemos una referencia fuerte a una variable, su conteo de retención se incrementa en uno y la variable no se desasignará hasta que el conteo de retención de iy llegue a 0.
Espero que esto ayude.
Puede ser útil pensar en referencias fuertes y débiles en términos de globos.
Un globo no volará siempre y cuando al menos una persona se aferre a una cuerda atada a él. El número de personas que tienen cuerdas es la cuenta de retención. Cuando nadie se aferra a una cuerda, el globo se va volando (dealloc). Muchas personas pueden tener cuerdas a ese mismo globo. Puede obtener / establecer propiedades y métodos de llamada en el objeto referenciado con referencias fuertes y débiles.
Una referencia fuerte es como sujetar una cuerda a ese globo. Mientras mantengas una cuerda atada al globo, no volará.
Una referencia débil es como mirar el globo. Puedes verlo, acceder a sus propiedades, llamar a sus métodos, pero no tienes una cadena para ese globo. Si todos los que sostienen la cuerda se van, el globo se va volando y ya no puedes acceder a él.
Una referencia sólida (que usará en la mayoría de los casos) significa que desea "poseer" el objeto al que hace referencia con esta propiedad / variable. El compilador se encargará de que cualquier objeto que asigne a esta propiedad no se destruya siempre que lo señale con una referencia sólida. Solo una vez que establezca la propiedad en nil
, el objeto se destruirá (a menos que uno o más de los otros objetos también contengan una fuerte referencia a él).
En contraste, con una referencia débil significa que no desea tener control sobre la vida útil del objeto. El objeto al que hace referencia débilmente vive solo porque al menos otro objeto tiene una referencia fuerte a él. Una vez que ya no sea así, el objeto se destruye y su propiedad débil se establecerá automáticamente en nil
. Los casos de uso más frecuentes de referencias débiles en iOS son:
delegar propiedades, a las que a menudo se hace referencia débilmente para evitar retener ciclos, y
subvistas / controles de la vista principal de un controlador de vista porque esas vistas ya están fuertemente sostenidas por la vista principal.
atómico versus no atómico se refiere a la seguridad de subprocesos de los métodos de obtención y establecimiento que el compilador sintetiza para la propiedad. atomic (el valor predeterminado) le dice al compilador que haga que los métodos de acceso sean seguros para subprocesos (agregando un bloqueo antes de acceder a un ivar) y nonatomic hace lo contrario. La ventaja de no atómico es un rendimiento ligeramente superior. En iOS, Apple usa nonatomic para casi todas sus propiedades, por lo que el consejo general es que usted haga lo mismo.
Fuerte : Básicamente se utiliza con las propiedades que usamos para obtener o enviar datos de / a otras clases. Débil : por lo general, todas las salidas y conexiones son de tipo Débil desde la interfaz.
No atómico : este tipo de propiedades se utilizan en condiciones en las que no queremos compartir nuestra salida u objeto en diferentes subprocesos simultáneos. En otras palabras, la instancia no atómica hace que nuestras propiedades se ocupen de un hilo a la vez. Esperemos que sea útil para usted.
Una respuesta ficticia: -
Creo que la explicación está dada en la respuesta anterior, así que solo te diré dónde usar STRONG
y dónde usar WEAK
:
Uso de Weak
: - 1. Delegados 2. Outlets 3. Subvistas 4. Controles, etc.
Uso de Strong
: - Permanecer en todas partes, lo que no está incluido en WEAK
.
fuerte es el predeterminado Un objeto permanece "vivo" siempre que haya un puntero fuerte en él.
débil especifica una referencia que no mantiene vivo el objeto al que se hace referencia. Una referencia débil se establece en nulo cuando no hay referencias sólidas al objeto.
fuertes y débiles , estas palabras clave giran en torno a la propiedad de objetos en Objective-C
¿Qué es la propiedad del objeto?
Las variables de puntero implican la propiedad de los objetos a los que apuntan.
- Cuando un método (o función) tiene una variable local que apunta a un objeto, se dice que esa variable posee el objeto al que se apunta.
- Cuando un objeto tiene una variable de instancia que apunta a otro objeto, se dice que el objeto con el puntero es el propietario del objeto al que se apunta.
Cada vez que una variable de puntero apunta a un objeto, ese objeto tiene un propietario y permanecerá vivo. Esto se conoce como una referencia fuerte .
Opcionalmente, una variable no puede tomar posesión de un objeto al que apunta. Una variable que no toma posesión de un objeto se conoce como una referencia débil .
Eche un vistazo para obtener una explicación detallada aquí Desmitificando la propiedad y los atributos
strong : le asigna el valor entrante, retendrá el valor entrante y liberará el valor existente de la variable de instancia
débil : le asignará el valor entrante sin retenerlo.
Entonces, la diferencia básica es la retención de la nueva variable. Por lo general, desea conservarlo, pero hay situaciones en las que no desea tenerlo, de lo contrario obtendrá un ciclo de retención y no podrá liberar la memoria de los objetos. P.ej. obj1 retiene obj2 y obj2 retiene obj1. Para resolver este tipo de situaciones se utilizan referencias débiles.