¿Cuál es la diferencia entre 'débil' y 'asignar' en la declaración de propiedad delegada?


87

¿Cuál es la diferencia entre esto?

@property (nonatomic, weak) id  <SubClassDelegate> delegate; 

y esto:

@property (nonatomic, assign) id  <SubClassDelegate> delegate; 

Quiero usar propiedad para delegados.

Respuestas:


153

La única diferencia entre weaky assignes que si el objeto al que weakapunta una propiedad está desasignado, entonces el valor del weakpuntero se establecerá en nil, por lo que nunca corre el riesgo de acceder a la basura. Si lo usa assign, eso no sucederá, por lo que si el objeto se desasigna debajo de usted e intenta acceder a él, accederá a la basura.

Para los objetos Objective-C, si se encuentra en un entorno en el que puede usar weak, entonces debería usarlo.


16
¿Sabe por qué algunas de las clases del marco de Cocoa Touch todavía usan la asignación para delegados? Por ejemplo, el delegado de UISearchDisplayController todavía está asignado. ¿Por qué no se actualizó nunca?
Pwner

@Pwner parece que ha quedado obsoleto en iOS 8.0
Stavash

Aquí hay un ejemplo no obsoleto: incluso UITableViewtiene assignpara su delegado:@property (nonatomic, assign) id <UITableViewDelegate> delegate;
Chris Nolet

3
@ChrisNolet Porque probablemente todavía estén usando MRC (Recuento manual de referencias) internamente.
Marco Sero

2
A partir de hoy, el ejemplo del delegado de UITableView ahora es: @property (no atómico, débil, anulable) id <UITableViewDelegate> delegado; Entonces ese ya no es un ejemplo válido.
sdoowhsoj
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.