在测试我正在开发的应用程序时,我遇到了这个问题,我想讨论一下。 我有一个类需要从服务器接收消息,需要将消息中继到视图。我就是这样做的:
- (void) onMessage:(DFTopicMessage *) message {
[[NSNotificationCenter defaultCenter]
postNotificationName:@"serverMessage"
object:message];
}
该课程不对该消息做任何其他事情。当我用仪器配置文件时 - >泄漏,这行代码被标记为潜在泄漏。我理解的问题是,消息是分配,使用还是永不释放。第一件奇怪的事情是我在我的项目中使用ARC,因此希望操作系统自动释放var,但显然情况并非如此(那么,为什么不释放var?)。无论如何,我开始考虑如何避免这种泄漏。只需将消息设置为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]];
}
}
现在如果我使用下面的方法进行分析,仪器 - >泄漏将不再将此标记为潜在泄漏。我的问题是:这是使用ARC时强制释放var的唯一解决方案吗?
提前致谢!
答案 0 :(得分:0)
当您分析项目时,它是否也将此方法标记为可能的泄漏?(我怀疑不是)。
您确定Instruments检测到的泄漏是此消息对象吗?如果是,它看起来一定是误报,因为,启用ARC后,这不应该泄漏。