【问题标题】:releasing objects when using ARC使用 ARC 时释放对象
【发布时间】:2012-05-04 04:38:56
【问题描述】:

在测试我正在开发的应用程序时,我遇到了这个问题,我想讨论一下。 我有一个类需要从服务器接收消息并需要将消息中继到视图。我就是这样做的:

- (void) onMessage:(DFTopicMessage *) message {    
    [[NSNotificationCenter defaultCenter] 
     postNotificationName:@"serverMessage" 
     object:message];
}

该类不对消息做任何其他事情。当我使用 Instruments -> Leaks 进行分析时,这行代码被标记为潜在泄漏。我理解的问题是,消息被分配、使用并且从未被释放。第一个奇怪的事情是我在我的项目中使用 ARC,因此希望操作系统自动释放 var,但显然情况并非如此(那么,为什么它不释放 var?)。无论如何,我开始思考如何避免这种泄漏。只需将 message 设置为 nil,例如:

- (void) onMessage:(DFTopicMessage *) message {    
    [[NSNotificationCenter defaultCenter] 
     postNotificationName:@"serverMessage" 
     object:message];
      message = nil;
}

不会阻止泄漏。我找到了使消息成为 ivar 并使用如下访问器的解决方案:

@interface myClass()
@property(nonatomic) DFTopicMessage *message;
@end

@implementation myClass {
@synthetize message;
    ....
   - (void) onMessage:(DFTopicMessage *) msg {
        [self setMessage:msg];

        [[NSNotificationCenter defaultCenter] 
        postNotificationName:@"serverMessage" 
        object:[self message]];

    }
}

现在,如果我使用以下方法进行分析,Instruments -> Leak 将不再将其标记为潜在泄漏。我的问题是:这是在使用 ARC 时强制释放 var 的唯一解决方案吗?

提前致谢!

【问题讨论】:

  • 您确定启用了 ARC 吗? [msg retain] 是该文件中的编译器错误吗?
  • 我怀疑 Instruments 在这里只是给出了一个误报......但是,您的“解决方案”不是一个:您只是存储了对 message 的附加引用,从而诱使 Instruments 认为仍然需要对象。你实际上并没有以这种方式释放message(但无论如何这不应该是必需的)。
  • 感谢你们的cmets。 @BJ Homer:我完全确定我正在使用 ARC,[msg release] 在使用 ARC 时给出了关于显式释放变量的错误。
  • @MrMage: 是的——使 var 成为 ivar 确实存储了对消息的附加引用。但是,通过使用访问器,我确保不会丢失指向单元格的指针,这似乎允许使用 ARC 进行正确的自动释放。至少,这是 Instruments 所说的。
  • 但是 ivars 默认不是弱引用吗?

标签: iphone profiling automatic-ref-counting instruments memory-leaks


【解决方案1】:

当您分析项目时,它是否也将此方法标记为可能的泄漏?(我怀疑不是)。

您确定 Instruments 检测到的泄漏是这个消息对象吗?如果是,它看起来一定是误报,因为启用了 ARC,这不应该泄漏。

【讨论】:

    猜你喜欢
    • 2013-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-08
    • 2011-12-18
    • 2014-06-11
    • 2023-03-19
    相关资源
    最近更新 更多