3
在測試我正在開發的應用程序時,我遇到了這個我想討論的問題。 我有一個需要從服務器接收消息並需要將消息轉發到視圖的類。這就是我的做法:使用ARC時釋放對象
- (void) onMessage:(DFTopicMessage *) message {
[[NSNotificationCenter defaultCenter]
postNotificationName:@"serverMessage"
object:message];
}
該類不會對消息做任何其他操作。當我用儀器 - >泄漏進行剖析時,這行代碼被標記爲潛在泄漏。我所瞭解的問題是,該消息是分配,使用,並從未發佈。第一件奇怪的事情是,我在我的項目中使用了ARC,因此希望操作系統自動發佈這個var,但顯然不是這種情況(那麼,它爲什麼不釋放這個var?)。無論如何,我開始思考如何避免這種泄漏。只需將消息設置爲零,如:
- (void) onMessage:(DFTopicMessage *) message {
[[NSNotificationCenter defaultCenter]
postNotificationName:@"serverMessage"
object:message];
message = nil;
}
不會阻止泄漏。我發現在製作消息中的實例變量和使用存取這樣一個解決方案:
@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的唯一解決方案嗎?
在此先感謝!
您是否絕對確定ARC已啓用?是'[msg retain]'該文件中的編譯器錯誤? – 2012-04-23 18:34:24
我懷疑儀器只是在這裏給出一個誤報......然而,你的「解決方案」不是一個:你只是存儲一個對'message'的額外引用,從而欺騙了Instruments認爲該對象仍然是需要的。你實際上並沒有以這種方式釋放'消息'(但是這不應該是必須的)。 – MrMage 2012-04-23 20:55:08
謝謝你的意見。 @BJ Homer:我完全相信我正在使用ARC,[msg release]給出了在使用ARC時顯式釋放變量的錯誤。 – Diferdin 2012-04-25 14:33:12