使用ARC时释放对象的方法

3

在测试我正在开发的应用程序时,我遇到了这个问题,希望讨论一下。 我有一个需要从服务器接收消息并将该消息传递给视图的类。我的做法如下:

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

这个类除了处理消息之外没有其他功能。当我使用Instruments -> Leaks进行性能分析时,这行代码被标记为潜在泄漏。我理解的问题是,消息被分配、使用后从未释放。第一件奇怪的事情是,我的项目中使用ARC,因此我期望操作系统会自动释放变量,但显然并非如此(那么,为什么它不释放变量呢?)。无论如何,我开始考虑如何避免这个泄漏。只需将消息设置为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]是编译器错误吗? - BJ Homer
但是ivars默认不是弱引用吗? - MrMage
我想你应该将它们声明为弱引用,这样才能被视为弱引用,对吗? - Diferdin
@MrMage 不,任何 ARC 下的对象变量默认都是 __strong。@Diferdin 你是否沿着 onMessage: 的调用栈走过去,并确保问题不是在生成消息的地方? - danyowdee
你找到这个问题的答案了吗?我在想你的代码其他部分可能会引用你的信息。 - Resh32
显示剩余5条评论
1个回答

0

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接