反应式可可 - 侦听通知和内存管理



我想知道其他人是否对反应式可可听通知方法有问题。我正在使用以下代码遇到保留周期,并且从未调用我的 viewController dealloc 方法。如果我不侦听该通知,我的视图控制器已正确解除分配

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

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的引用似乎不是弱引用,这意味着绑定块对self具有("所有权")引用。如果是这样,self将永远不会被释放,因此self.rac_willDeallocSignal永远不会发送值。这意味着观察者永远不会从NSNotificationCenter中移除。

最新更新