rac_textSignal-Implementation使用“defer”在“self”上返回RACSignal。 这是什么原因?
这是实施:
- (RACSignal *)rac_textSignal {
@weakify(self);
return [[[[[RACSignal
defer:^{
@strongify(self);
return [RACSignal return:self];
}]
concat:[self rac_signalForControlEvents:UIControlEventEditingChanged]]
map:^(UITextField *x) {
return x.text;
}]
takeUntil:self.rac_willDeallocSignal]
setNameWithFormat:@"%@ -rac_textSignal", [self rac_description]];
}
答案 0 :(得分:3)
延迟信号和连接信号都发送UITextField
s(有效self
)。
延迟信号使返回的信号在订阅时发送当前存储的文本,因为[self rac_signalForControlEvents:UIControlEventEditingChanged]
仅发送更改。
答案 1 :(得分:1)
如果你要省略推迟并实施它,如:
- (RACSignal *)rac_textSignal {
@weakify(self);
return [[[[[RACSignal return:self]
concat:[self rac_signalForControlEvents:UIControlEventEditingChanged]]
map:^(UITextField *x) {
return x.text;
}]
takeUntil:self.rac_willDeallocSignal]
setNameWithFormat:@"%@ -rac_textSignal", [self rac_description]];
}
我仍然不完全理解RAC
内存管理,但是,在上面的实现中,您的信号将强烈引用self
,永远不会完成,您将最终得到zombie {{ 1}}。
答案 2 :(得分:0)
我认为推迟只是为了防止保留周期