ios - Reactive Cocoa - 监听通知和内存管理

标签 ios reactive-cocoa

我想知道其他人是否对 Reactive Cocoa listenForNotification 方法有疑问。 我正在使用以下代码经历一个保留周期,并且从未调用过我的 viewController dealloc 方法。 如果我不收听该通知,我的 viewController 将被正确释放

这是完整的更新代码块,我在其中调用方法来监听通知:

RACSignal *postSignal = [RACSignal empty];        
postSignal = [[[[NSNotificationCenter defaultCenter] rac_addObserverForName:kNotification object:self.conversation] takeUntil:self.rac_willDeallocSignal]] bind:^RACStreamBindBlock{
        return ^RACSignal *(NSNotification *note, BOOL *stop) {
            XXStatus status = [note.userInfo[@"status"] longValue];
            if (status == XXStatusPosted) {
                *stop = YES;
                return [RACSignal empty];
            } else {
                return [RACSignal error:note.userInfo[@"error"]];
            }
        };

[[[[RACSignal merge:@[uploadSignal, postSignal]] deliverOnMain] subscribeCompleted:^{
    [self doSomethingX];
} error:^(NSError *error) {
    [self doSomethingOnFail:error];
}] autoDispose:self];

您知道 RAC 内存管理如何处理监听通知吗?其中通知中心是应用程序中的默认通知中心。并且该方法包含在 NSObject 类的类别扩展中。

感谢您的回答。

最佳答案

这并不是一个完整的代码片段(它有不平衡的定界符),因此您可能不小心遗漏了一些可能使代码更清晰的内容。但看起来好像你有一个保留周期的原因在最后一行:

}] autoDispose:self];

self 的引用似乎不是弱引用,这意味着绑定(bind) block 具有strong(“所有权” ) 对 self 的引用。如果是这样,self 将永远不会被释放,因此 self.rac_willDeallocSignal 永远不会发送值。 意味着观察者永远不会从NSNotificationCenter中删除。

关于ios - Reactive Cocoa - 监听通知和内存管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21118025/

相关文章:

swift - 未设置可选 MutableProperty 的 Reactive Swift 绑定(bind)?

objective-c - 如何保证 ReactiveCocoa 中订阅者消息的顺序?

objective-c - 如何使用 ReactiveCocoa 简化我的嵌套 for 循环?

ios - 如何在 SignalProducer 上映射值和错误

android - 为 iOS/Android 移动应用程序缓存数据以与分页一起使用

c# - 加密 mdm 配置文件

ios - AdHoc Beta 测试的代码签名

iOS MVVM 处理初始 View 状态

ios - 在针对 iOS 11 的 Xcode 9 上构建应用程序,但在 iPhone X 上具有兼容模式

ios - 运行循环以将颜色设置为按钮 ios?