在测试我正在开发的应用程序时,我遇到了这个问题,我想讨论一下。我有一个类需要从服务器接收消息并需要将消息中继到视图。我就是这样做的:
- (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 的唯一解决方案吗?
提前致谢!