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的唯一解決方案嗎?

在此先感謝!

+0

您是否絕對確定ARC已啓用?是'[msg retain]'該文件中的編譯器錯誤? – 2012-04-23 18:34:24

+0

我懷疑儀器只是在這裏給出一個誤報......然而,你的「解決方案」不是一個:你只是存儲一個對'message'的額外引用,從而欺騙了Instruments認爲該對象仍然是需要的。你實際上並沒有以這種方式釋放'消息'(但是這不應該是必須的)。 – MrMage 2012-04-23 20:55:08

+0

謝謝你的意見。 @BJ Homer:我完全相信我正在使用ARC,[msg release]給出了在使用ARC時顯式釋放變量的錯誤。 – Diferdin 2012-04-25 14:33:12

回答

0

當你分析項目時,它是否也將這種方法標記爲可能的泄漏?(我懷疑沒有)。

您確定儀器檢測到的泄漏是此消息對象嗎?如果是這樣,它看起來必須是誤報,因爲在啓用ARC的情況下,這不應該泄漏。