objective-c typeof weak

objective c - ¿Qué es exactamente lo que hace ''__ tipo débil de(sí mismo) débil? Sí mismo'' yo ''; media



objective-c typeof (4)

Esto se usa en el patrón de debilitamiento de Objective-C

Supongo que significa: asigne una referencia débil a sí mismo con el nombre ''weakSelf'' y el tipo de self (por ejemplo, MyViewController)

Si es correcto y le parece obvio: quiero estar absolutamente seguro de hacerlo bien. Gracias.


Mi conjetura es que significa: asigne una referencia débil a sí mismo con el nombre weakSelf y el tipo de self (por ejemplo, MyViewController )

Sí, eso es casi exactamente lo que significa. El tipo de self sería MyViewController* (con un asterisco) no MyViewController .

La idea detrás de usar esta sintaxis en lugar de simplemente escribir

MyViewController __weak *weakSelf = self;

Está haciendo más fácil refactorizar el código. El uso de typeof también hace posible definir un fragmento de código que se puede pegar en cualquier parte de su código.


Dependiendo de la configuración de su compilador, puede recibir una advertencia "Esperaba '';'' después de la expresión ". Puede solucionar esto cambiando para usar __typeof como esto: __typeof(self) __weak weakSelf = self;

Gracias a Leo Natan y esta pregunta: https://.com/a/32145709/1758224 .


Su interpretación es correcta. Sin embargo, me parece que cuando está escrito de esa manera, es un poco confuso leerlo. Lo prefiero con un espacio adicional después de typeof(self) :

__weak typeof(self) weakSelf = self;


Usar @weakify y @strongify desde libExtObjC ayuda a simplificar la "danza débil-fuerte" que uno tiene que hacer a veces alrededor de bloques. El OP cita este article .

¡Ejemplo!

__weak __typeof(self) weakSelf = self; __weak __typeof(delegate) weakDelegate = delegate; __weak __typeof(field) weakField = field; __weak __typeof(viewController) weakViewController = viewController; [viewController respondToSelector:@selector(buttonPressed:) usingBlock:^(id receiver){ __strong __typeof(weakSelf) strongSelf = weakSelf; __strong __typeof(weakDelegate) strongDelegate = weakDelegate; __strong __typeof(weakField) strongField = weakField; __strong __typeof(weakViewController) strongViewController = weakViewController;

versus...

@weakify(self, delegate, field, viewController); [viewController respondToSelector:@selector(buttonPressed:) usingBlock:^(id receiver){ @strongify(self, delegate, field, viewController);