我知道您应该使用@weakify @strongify来避免保留周期,但我不完全理解他们是如何实现这一目标的?
答案 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
就位,编译器会显示错误