Iphone 使用圆弧时释放对象

Iphone 使用圆弧时释放对象,iphone,profiling,automatic-ref-counting,instruments,memory-leaks,Iphone,Profiling,Automatic Ref Counting,Instruments,Memory Leaks,在测试我正在开发的应用程序时,我遇到了这个问题,我想讨论一下。 我有一个类需要从服务器接收消息,并需要将消息中继到视图。我就是这样做的: - (void) onMessage:(DFTopicMessage *) message { [[NSNotificationCenter defaultCenter] postNotificationName:@"serverMessage" object:message]; } 该类不会对消息执行任何其他操作。当

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

- (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时,它不应该泄漏。

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