【问题标题】:Explanation of how weakify and strongify work in ReactiveCocoa / libextobjcReactiveCocoa / libextobjc中weakify和strongify如何工作的解释
【发布时间】:2014-03-10 03:10:16
【问题描述】:

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

【问题讨论】:

  • @jamieforrest 我注意到你已经编辑了这个问题。当我最初问这个问题时,我肯定指的是 ReactiveCocoa,尽管这些宏可能源自 libextobjc,在我使用的版本中,它们定义在名为 RACEXTScope.h 的头文件中,该文件存在于 ReactiveCocoa 中,而不是一个外部依赖。我认为我们应该在标题中保留 ReactiveCocoa 并附加 libextobjc 而不是替换它。
  • 有道理。我加回来了。

标签: reactive-cocoa libextobjc


【解决方案1】:

预处理前的代码:

@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:我正在努力学习英语。我希望你能明白我在说什么。)

【讨论】:

  • 如果我错了,请纠正我——所以,如果我忘记将 @strongify(self) 放在块中,那么我在块中使用的 self 仍然是原始(未阴影)自我,并会被强烈保留?仍然很容易出错:(
  • 是的,这听起来很对。我们需要一个新的 Obj-C 语法,内置 strongify/weakify!
【解决方案2】:

在写这个问题时,我更仔细地盯着宏定义,我认为它的工作原理和你可能猜到的一样。

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

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

【讨论】:

    【解决方案3】:

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

    以下是一些相关的引述:

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

    现在,您可能会问:如果我忘记使用strongify 怎么办?这是一个很酷的部分:weakify 创建了一个新的局部变量,因此如果根本不使用它,我们会收到警告。

    你可以想象,如果你忘记使用weakify,但是strongify在它的位置,编译器会显示一个错误

    【讨论】:

    • 我最初的问题是关于反应性可可。包含 libextobjc 是其他用户编辑的结果,他们认为这个问题也适用于该案例,我不能说它是否有效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-13
    • 2016-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-08
    • 2021-10-24
    相关资源
    最近更新 更多