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
self
segura, por ejemplo, la macroNSAssert
. Todavía es posible hacer referencia alself
real, usando univar
. Sin embargo, conduce a una advertencia, por lo que es un error que es fácil de detectar.Ahora, puedes preguntar: ¿qué
strongify
si me olvido de usarstrongify
? Esta es una parte interesante:weakify
crea 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 destrongify
está 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.