1

內存管理我有一個使用dispatch_asynciPhone:與dispatch_async

- (void)_handleMessage:(id)message{ 
    dispatch_async(_callbackQueue, ^{ 
     [self.delegate webSocket:self didReceiveMessage:message]; 
    }); 
} 

我打電話這樣

NSString *str = [[NSString alloc] initWithData:frameData encoding:NSUTF8StringEncoding]; 
[self _handleMessage:str] 
//[str release]; <== Can I release str here??? 

這個函數的函數我的問題是

  • 我在哪裏可以釋放變量str

通常我可以只調用[self _handleMessage:str]後釋放,但由於dispatch_async執行語句

[self.delegate webSocket:self didReceiveMessage:message]; 

異步(可能是一段時間後),我正在考慮一個壞訪問錯誤。在這種情況下管理內存的最佳方式是什麼?

如果您還有疑問,我是一個老派的人,而不是使用ARC

回答

7
//[str release]; <== Can I release str here??? 

據我瞭解,你可以釋放該變量存在。 Indeed

在手動引用計數環境中,當該塊被複制的塊內使用的局部變量被保留。在塊內使用實例變量將導致對象本身被保留。如果您希望覆蓋特定對象變量的此行爲,可以使用__block存儲類型修飾符標記它。

這意味着塊將保留您在它使用message對象,它會釋放它完成的時候,所以你可以調用_handleMessage後自由釋放。

+0

作爲確鑿的答案,因爲它得到..感謝塞爾吉奧..只要stackoverflow允許我這樣做將接受.. – Krishnabhadra

+1

@Krishnabhadra:很高興有幫助... – sergio