iphone:使用dispatch_async进行内存管理

时间:2012-06-20 10:21:48

标签: iphone objective-c ios memory-management grand-central-dispatch

我有一个使用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

1 个答案:

答案 0 :(得分:7)

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

据我了解,您可以在那里发布变量。 Indeed

  

在手动引用计数环境中,复制块时会保留块中使用的局部变量。在块中使用实例变量将导致保留对象本身。如果您希望覆盖特定对象变量的此行为,可以使用__block存储类型修饰符对其进行标记。

这意味着该块将保留您在其中使用的message对象,并在完成后将其释放,因此您可以在调用_handleMessage后自由释放它。