我有一个使用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
答案 0 :(得分:7)
//[str release]; <== Can I release str here???
据我了解,您可以在那里发布变量。 Indeed:
在手动引用计数环境中,复制块时会保留块中使用的局部变量。在块中使用实例变量将导致保留对象本身。如果您希望覆盖特定对象变量的此行为,可以使用__block存储类型修饰符对其进行标记。
这意味着该块将保留您在其中使用的message
对象,并在完成后将其释放,因此您可以在调用_handleMessage
后自由释放它。