Hay dos nuevos atributos de administración de memoria para las propiedades introducidas por ARC, strong
y weak
.
Aparte de copy
, que obviamente es algo completamente diferente, ¿hay alguna diferencia entre strong
vs retain
y weak
vs assign
?
Según tengo entendido, la única diferencia aquí es que weak
se asignará nil
al puntero, mientras assign
que no lo hará, lo que significa que el programa se bloqueará cuando envíe un mensaje al puntero una vez que se haya lanzado. Pero si lo uso weak
, esto nunca sucederá, porque el mensaje enviado a nil
no hará nada.
No sé acerca de las diferencias entre strong
y retain
.
¿Hay alguna razón por la que debería usar assign
y retain
en nuevos proyectos, o están siendo desaprobados?
ios
objective-c
ios5
properties
automatic-ref-counting
Jakub Arnold
fuente
fuente
strong
,weak
yunsafe_unretained
.weak
ystrong
) y 4 calificadores de toda la vida variables (__strong
,__weak
,__unsafe_unretained
,__autoreleasing
). Vea las notas de ARC a continuación.assign
al compilar con ARC fue un error. Hay muchas respuestas eliminadas sobre esto. Parece que fue cambiado antes del lanzamiento final.unsafe_unretained
es el atributo preferido para muchos de los primeros en adoptar. Para comprobar queunsafe_unretained
es un atributo válido, consulte "Programación con Objective-C" de Apple en la sección "Datos encapsulados" bajo el subtítulo "Usar referencias no retenidas inseguras para algunas clases". Que dice: "Para una propiedad, esto significa usar el atributo unsafe_unretained:"Respuestas:
Desde la transición a las notas de la versión ARC (el ejemplo en la sección sobre atributos de propiedad).
Entonces
strong
es lo mismo queretain
en una declaración de propiedad.Para proyectos ARC que usaría en
strong
lugar deretain
, usaríaassign
para propiedades primitivas C yweak
para referencias débiles a objetos Objective-C.fuente
assign
para un objeto. Debe usar unoweak
ounsafe_unretained
(lo cual no es seguro, obviamente) si no desea conservar la propiedad.assign
compila muy bien para mí en proyectos ARC con destino de implementación 4.0.retain
vsstrong
. Supongo que es en su mayoría inofensivo, pero imagino que debería serstrong
por consistencia ... o tal vez no importa. stackoverflow.com/questions/7796476/…assign
todavía es válido en algunos casos.Después de leer tantos artículos, publicaciones de Stackoverflow y aplicaciones de demostración para verificar los atributos de las propiedades variables, decidí reunir toda la información de los atributos:
A continuación se muestra 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í!
1.fuerte (iOS4 = retener)
Ejemplo:
2.weak -
Ejemplo:
Explicación fuerte y débil, gracias a BJ Homer :
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).
3.retener = fuerte
Ejemplo:
4.asignar
Ejemplo:
fuente
default
significa? Si lo uso@property (nonatomic) NSString *string
esstrong
? Oassign
? Porque ambos son valores predeterminados.no atómico / atómico
fuerte / débil / asignar
(Opcional)
Copiar
solo lectura
fuente
Hasta donde yo sé,
strong
yretain
son sinónimos, entonces hacen exactamente lo mismo.Entonces,
weak
es casi comoassign
, pero se establece automáticamente en nulo después de que el objeto al que apunta se desasigna.Eso significa que simplemente puede reemplazarlos.
Sin embargo , hay un caso especial que he encontrado, donde tuve que usar
assign
, en lugar deweak
. Digamos que tenemos dos propiedadesdelegateAssign
ydelegateWeak
. En ambos se almacena nuestro delegado, que nos posee al tener la única referencia fuerte. El delegado está desasignando, por lo que nuestro-dealloc
método también se llama.El delegado ya está en proceso de desasignación, pero aún no está desasignado completamente. ¡El problema es que las
weak
referencias a él ya están anuladas! La propiedaddelegateWeak
contiene nil, perodelegateAssign
contiene un objeto válido (con todas las propiedades ya liberadas y anuladas, pero aún válidas).Es un caso bastante especial, pero nos revela cómo funcionan esas
weak
variables y cuándo se anulan.fuente
El documento de Clang sobre Objective-C Automatic Reference Counting (ARC) explica claramente los calificadores y modificadores de propiedad:
Luego hay seis modificadores de propiedad para la propiedad declarada:
En cuanto a la semántica, los calificadores de propiedad tienen un significado diferente en las cinco operaciones administradas : Lectura, Asignación, Inicialización, Destrucción y Mudanza, en las que la mayoría de las veces solo nos importa la diferencia en la operación de Asignación.
La otra diferencia en Lectura, Iniciación, Destrucción y Movimiento, consulte la Sección 4.2 Semántica en el documento .
fuente
Para entender la referencia fuerte y débil, considere el siguiente ejemplo, suponga que tenemos un método llamado displayLocalVariable.
En el método anterior, el alcance de la variable myName se limita al método displayLocalVariable, una vez que el método termina, la variable myName que contiene la cadena "ABC" se desasignará de la memoria.
Ahora, ¿qué pasa 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 (ver
self.username = myName;
en el código a continuación), como a continuación,Ahora, en el código anterior, puede ver que myName ha sido asignado a self.username y self.username tiene una referencia fuerte (como declaramos 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é activo.
Ahora considere asignar myName a dummyName, que es una referencia débil, self.dummyName = myName; A diferencia de la referencia fuerte, Débil mantendrá myName solo hasta que haya una referencia fuerte a myName. Vea el código a continuación para comprender la referencia débil,
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 tanto self.dummyName no podrá mantener el valor myName.
Ahora nuevamente considere el siguiente código,
En el código anterior, self.username tiene una referencia Strong a myName, por lo tanto self.dummyName ahora tendrá un valor de myName incluso después de que termine el método, ya que myName tiene una referencia Strong asociada.
Ahora, cada vez que hacemos una referencia fuerte a una variable, su recuento de retención aumenta en uno y la variable no conseguirá que el recuento de retención desasignado llegue a 0.
Espero que esto ayude.
fuente
Fuerte:
Ejemplo: @property (fuerte, no atómico) ViewController * viewController;
@synthesize viewController;
Débiles
Por defecto se obtiene automáticamente y se establece en nulo
Ejemplo: @property (débil, no atómico) IBOutlet UIButton * myButton;
@ sintetizar myButton;
fuente
Las diferencias entre fuerte y retener:
Las diferencias entre débil y asignar:
fuente