- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当我创建一个信号并将其带入函数范围时,根据 Cocoa 约定,其有效保留计数为 0:
RACSignal *signal = [self createSignal];
RACDisposable *disposable = [signal subscribeCompleted:^ {
doSomethingPossiblyInvolving(self);
}];
self
或其 ivars 或封闭范围的其他部分。因此,当您订阅一个信号时,该信号对订阅者有一个拥有引用,而订阅者对您有一个拥有引用。你得到的一次性元素有一个对信号的拥有引用。
disposable -> signal -> subscriber -> calling scope
self.disposeToCancelWebRequest = disposable;
calling scope -> disposable -> signal -> subscriber -> calling scope
[self.disposeToCancelWebRequest dispose]
self.disposeToCancelWebRequest = nil;
self
时您不能这样做正在被释放,因为由于保留周期,这永远不会发生!在对订阅者的回调期间打破保留周期似乎也有些可疑,因为信号可能会在其实现仍在调用堆栈上时被释放。
最佳答案
老实说,ReactiveCocoa 的内存管理相当复杂,但值得的最终结果是 您不需要保留信号来处理它们 .
如果框架要求您保留每个信号,则使用起来会更加笨拙,尤其是对于像 future 一样使用的一次性信号(例如,网络请求)。您必须将任何长期存在的信号保存到属性中,然后确保在完成后将其清除。不好玩。
订户
在继续之前,我应该指出 subscribeNext:error:completed:
(及其所有变体)使用给定的块创建隐式订阅者。因此,从这些块引用的任何对象都将作为订阅的一部分保留。就像任何其他对象一样,self
如果没有直接或间接引用,则不会保留。
(根据您问题的措辞,我认为您已经知道这一点,但这可能对其他人有所帮助。)
有限或短期信号
RAC 内存管理最重要的指导原则是 订阅在完成或出错时自动终止,并删除订阅者 .要使用您的循环引用示例:
calling scope -> disposable -> signal -> subscriber -> calling scope
signal -> subscriber
关系一撕就断了
signal
完成,打破保留循环。
RACSignal
的生命周期在内存中自然会匹配事件流的逻辑生命周期。
-take:
或
-takeUntil:
将为您处理处理,您最终会获得更高级别的抽象。
self
的信号
RACAble()
时或
RACAbleWithStart()
在相对于
self
的关键路径上,然后应用需要捕获的块
self
.
self
弱 :
__weak id weakSelf = self;
[RACAble(self.username) subscribeNext:^(NSString *username) {
id strongSelf = weakSelf;
[strongSelf validateUsername];
}];
@weakify(self);
[RACAble(self.username) subscribeNext:^(NSString *username) {
@strongify(self);
[self validateUsername];
}];
__weak
或
@weakify
替换
__unsafe_unretained
或
@unsafeify
。)
[self rac_liftSelector:@selector(validateUsername:)
withObjects:RACAble(self.username)];
RACSignal *validated = [RACAble(self.username) map:^(NSString *username) {
// Put validation logic here.
return @YES;
}];
self
(或任何对象)来自信号链中的块。
I also notice that the implementation retains a process-global list of active signals.
关于cocoa - ReactiveCocoa 的引用所有权语义是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14100161/
我正在尝试构建一个 Cocoapod xcode 项目。我按照以下步骤在我的 mac 机器上配置 cocoapods(MAC OS yosemite 10.10.2,xcode 6.1.1 版本) s
假设我有一个返回 SignalProducer 的函数我想将生产者绑定(bind)到多个 MutableProperty .所以,像这样: let foo = SignalProducer(value
我编写了一个非常简单的 ReactiveCocoa 测试应用程序来尝试在 RAC 中编码(而不是无休止地阅读它)。在 Github 上,我想得到一些关于它的具体问题的答案。我将链接到代码组件。 首先,
我已经接管了一个实现 ReactiveCocoa 2.4.7 的 iOS 项目使用 CocoaPods。该应用程序是用 Swift 1.2 编写的,但后来进行了升级,现在是 Swift 2.3。然而R
当我创建一个信号并将其带入函数范围时,根据 Cocoa 约定,其有效保留计数为 0: RACSignal *signal = [self createSignal]; 当我订阅信号时,它会保留订阅者并
我想并行启动多个独立的网络请求,并在所有请求完成后订阅(我不在乎它们是否完成或出错)。 现在,我使用 combineLatest 。因此,这些请求是并行进行的(如我所愿),但是当信号发送error时,
我正在使用 MVVM 架构,我有两个信号: RACSignal *internetEnabledSignal = RACObserve(self.regWizardVehicleViewModel,
我有一个关于 ReactiveCocoa (v5) 与 Swift 3 的问题。在我的项目中,我有不同的服务。例如,API 或用于从磁盘保存或获取内容的 API。这些服务正在返回 SignalProd
我有一个搜索文本字段,当用户开始输入时,它会向用户提供自动完成建议的列表。用户也可以点击建议或按键盘的搜索按钮以使用输入文本执行搜索。 如果用户开始输入内容,然后在等待建议出现之前按下搜索,则可能会出
我正在编写一个库,它有一个返回 RACSignal 的方法,但只订阅 Complete 和 Error,而不订阅 Next。 我有一个 RACSignal,我想进一步传播,但忽略所有值。我从网络调用中
我在 View 模型中有以下代码: @weakify(self); [RACAbleWithStart(self.visitStartDate) subscribeNext:^(NSDate *vis
我正在测试 ReactiveCocoa 。在下面的代码中,我希望输出为: name : Item 1 arr : a1 arr : a2 name : Item 2 arr : b1 arr : b2
我成功地通过 CocoaPods 集成了 ReactiveCocoa。 该项目也会构建并运行。 在一个文件中我有这段代码: #import #import UITextField *fld = [
我正在尝试与登录服务通信并以 react 方式更新 UI。问题是我的登录服务与委托(delegate)一起工作,而且我发现的几乎每个示例都与 block 一起工作。 我写了一个可行的解决方案,但它似乎
我是 ReactiveCocoa 的新手,有一个问题我还没有找到解决的方法。我的应用程序中有一个网络请求,它返回要编码为二维码的数据,该二维码的有效期仅为 30 秒。网络请求返回一个 RACSigna
这里是 ReactiveCocoa 的新手。我有一个 (MVVM) View 模型,代表一个类似新闻源的页面,什么是监听数据模型属性变化的正确方法?在下面的示例中,startUpdate() 不断更新
我已经将 RAC 与 objective-c 一起使用,但现在无法与 swift 一起使用。 我下载了 ReactiveCocoaBindings.swift 并将其包含在我的项目中。 Here 临
我使用 ReactiveCocoa 有一段时间了,但我一直在这样做: // Assume match.status is an enum [RACAble(self.match.status) sub
我有一个 merge 操作,它依赖于两个异步操作的结果。一是网络操作,二是位置授权成败。我不关心这些操作的值,只关心它们都已完成。 这是它的样子: RACSignal *networkCallRetu
我正在使用 ReactiveCocoa 4.0.4 alpha 1 和 Swift 2.1。我正在尝试编写一个扩展,在 UITextField 上创建最大文本限制。 extension RACStre
我是一名优秀的程序员,十分优秀!