【问题标题】:Why does this snippet cause a leak?为什么这个片段会导致泄漏?
【发布时间】:2014-07-30 10:41:53
【问题描述】:

我有一个类方法:

+ (UIBarButtonItem*)navItemWhichAddsNewAction{
    UIBarButtonItem* addActionButton = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"icon_add"] style:UIBarButtonItemStylePlain target:nil action:nil];
    addActionButton.rac_command = [[RACCommand alloc] initWithSignalBlock:^RACSignal *(id input) {
        return [RACSignal empty];
    }];
    return addActionButton;
}

然后,在–viewDidLoad,我把这个方法的结果赋值给navigationItem的右键:

self.navigationItem.rightBarButtonItem = [MyClass navItemWhichAddsNewAction];

如果我随后使用 Instruments 分析应用程序,即使视图控制器(和导航控制器)被释放,上面的 rac_command 块也始终报告为已分配。

为什么?

【问题讨论】:

  • 什么是rac_command?请您也发布整个相关的UIBarButtonItem 类别好吗?
  • rac_command 是 ReactiveCocoa (reactivecocoa.io) 的一部分。
  • 你问过那个框架的作者这个问题了吗?
  • 是的,我已经在他们的 github 问题页面上发布了它,并且我在这里也用 reactive-cocoa 标记了它,希望这里也有一些 RAC 开发人员 ;)。
  • RAC 实现了一些常见的对象——[RACSignal empty][RACUnit defaultUnit],以及其他一些——作为发布版本中的单例,以减少不必要的分配。因此,这些对象在您的应用程序的生命周期内永远不会被释放,这会使它看起来就像您正在泄漏一个信号。如果您拨打[MyClass navItemWhichAddsNewAction] 十次,您最终会收到十个信号,还是只有一个?

标签: ios objective-c memory-leaks uibarbuttonitem reactive-cocoa


【解决方案1】:

信号未完成,可能由此引起泄漏。另一个副作用可能是由于这个原因没有第二次调用动作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-03
    • 1970-01-01
    相关资源
    最近更新 更多