在测试我正在开发的应用程序时,我遇到了这个问题,希望讨论一下。 我有一个需要从服务器接收消息并将该消息传递给视图的类。我的做法如下:
- (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的唯一解决方案吗?
提前感谢!
[msg retain]
是编译器错误吗? - BJ Homer__strong
。@Diferdin 你是否沿着onMessage:
的调用栈走过去,并确保问题不是在生成消息的地方? - danyowdee