1

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

4

1 回答 1

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

据我了解,您可以在那里释放变量。确实

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

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

于 2012-06-20T10:30:56.387 回答