Reactive Cocoa - 收听通知&内存管理

时间:2014-01-14 16:01:36

标签: ios reactive-cocoa

我想知道其他人是否存在Reactive Cocoa listenForNotification方法的问题。 我正在使用以下代码遇到保留周期,我的viewController dealloc方法永远不会被调用。 如果我不听那个通知我的viewController是正确的dealloc'ed

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

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类的类别扩展中。

感谢您的回答。

1 个答案:

答案 0 :(得分:1)

这不是一个完整的代码片段(它有不平衡的分隔符),所以你可能不小心留下了一些可能使它更清晰的东西。但它看起来就像你有一个保留周期的原因在最后一行:

}] autoDispose:self];

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