¿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.

Firdous
fuente

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.

Yuji
fuente
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