reactive cocoa - Explicación de cómo el trabajo de debilitar y fortalecer en ReactiveCocoa/libextobjc
reactive-cocoa (3)
Al escribir la pregunta, me fijé más en las definiciones de macros y creo que funciona como se puede imaginar.
@weakify crea una nueva variable con una referencia débil del mismo tipo que pasa y le asigna el valor original
@strongify crea una variable que coincide con la variable original pero existe en el ámbito local y le asigna la variable creada por @weakify
¿Entiendo que debería usar @weakify @strongify para evitar los ciclos de retención, pero no entiendo completamente cómo logran esto?
En primer lugar, importa la implementación de @weakify & @strongify que esté utilizando, ya que no forman parte del lenguaje estándar. Suponiendo que está utilizando la versión de ReactiveCocoa, aquí hay un buen article sobre qué son y cómo funcionan.
Aquí hay algunas citas relevantes:
Incluso el código no escrito por nosotros puede usarse de
selfsegura, por ejemplo, la macroNSAssert. Todavía es posible hacer referencia alselfreal, usando univar. Sin embargo, conduce a una advertencia, por lo que es un error que es fácil de detectar.Ahora, puedes preguntar: ¿qué
strongifysi me olvido de usarstrongify? Esta es una parte interesante:weakifycrea una nueva variable local, así que si no se usa en absoluto, recibimos una advertencia.Como se puede imaginar, si se olvida de utilizar
weakify, pero la función destrongifyestá en su lugar, el compilador muestra un error.
código antes de preproceso:
@weakify(self)
[[self.searchText.rac_textSignal
map:^id(NSString *text) {
return [UIColor yellowColor];
}]
subscribeNext:^(UIColor *color) {
@strongify(self)
self.searchText.backgroundColor = color;
}];
código después del preproceso:
@autoreleasepool {} __attribute__((objc_ownership(weak))) __typeof__(self) self_weak_ = (self);
[[self.searchText.rac_textSignal
map:^id(NSString *text) {
return [UIColor yellowColor];
}]
subscribeNext:^(UIColor *color) {
@try {} @finally {}
__attribute__((objc_ownership(strong))) __typeof__(self) self = self_weak_; // 1
self.searchText.backgroundColor = color; //2
}];
1: definir una nueva variable local "self". Esto va a sombrear el mundial.
2: así que aquí usamos la variable local "self" - self_weak_.
consejos:
1. Si utilizamos self.xxx en bloque, deberíamos colocar @strongify (self) sobre él.
2. no olvide usar @weakify (self) para definir la variable self_weak_.
(PD: estoy tratando de aprender inglés. Espero que puedas entender lo que estoy diciendo.