reactive-cocoa libextobjc

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 macro NSAssert . Todavía es posible hacer referencia al self real, usando un ivar . 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 usar strongify ? 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 de strongify 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.