解释ReactiveCocoa/libextobjc中的弱化和强化工作方式

nac*_*oss 22 reactive-cocoa libextobjc

我知道你应该使用@weakify @strongify来避免保留周期,但我不完全理解它们是如何实现这一目的的?

dus*_*sty 27

预处理前的代码:

@weakify(self)
[[self.searchText.rac_textSignal
  map:^id(NSString *text) {
      return [UIColor yellowColor];
  }]
 subscribeNext:^(UIColor *color) {
     @strongify(self)
     self.searchText.backgroundColor = color;
 }];
Run Code Online (Sandbox Code Playgroud)

预处理后的代码:

@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
     }];
Run Code Online (Sandbox Code Playgroud)

1:定义一个新的局部变量"self".这将影响全球的影响力.

2:所以这里我们使用局部变量"self" - self_weak_.

提示:

1.如果我们在块中使用self.xxx,我们应该将@strongify(self)放在它上面.

2.不要忘记使用@weakify(self)来定义变量self_weak_.

(PS:我正在努力学习英语.我希望你能理解我在说什么.)


nac*_*oss 19

在写这个问题的时候,我更加注重宏观定义,我认为它可以像你猜测的那样工作.

@weakify创建一个与您传入的相同类型的新弱引用变量,并将原始值赋给它

@strongify创建一个与原始变量匹配的变量,但它存在于本地范围内,并为其分配由@weakify创建的变量