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

时间:2014-02-12 01:46:13

标签: reactive-cocoa libextobjc

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

3 个答案:

答案 0 :(得分:27)

预处理之前的

代码:

@weakify(self)
[[self.searchText.rac_textSignal
  map:^id(NSString *text) {
      return [UIColor yellowColor];
  }]
 subscribeNext:^(UIColor *color) {
     @strongify(self)
     self.searchText.backgroundColor = color;
 }];
预处理后的

代码:

@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:定义一个新的局部变量“self”。这将影响全球的影响力。

2:所以这里我们使用了局部变量“self” - self_weak_。

提示:

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

2.忘记使用@weakify(self)来定义变量self_weak _。

(PS:我正在努力学习英语。我希望你能理解我所说的话。)

答案 1 :(得分:19)

在撰写问题时,我更加注重宏观定义,我认为它的工作原理与你猜测的一样。

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

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

创建的变量

答案 2 :(得分:0)

首先,重要的是@weakify&的实施。您使用的@strongify因为这些不是标准语言的一部分。 假设你正在使用ReactiveCocoa版本,这里有一个很好的article关于它们是什么以及它们是如何工作的。

以下是一些相关的引用:

  

即使我们编写的代码也可以安全地使用self,例如NSAssert宏。   通过使用self,仍然可以引用真实ivar。但是它会导致警告,因此很容易发现

这是一个错误      

现在,您可能会问:如果我忘记使用strongify该怎么办?这是一个很酷的部分:weakify创建一个新的局部变量,所以如果它没有被使用,我们会收到警告。

     

您可以想象,如果您忘记使用weakify,但strongify就位,编译器会显示错误