我必须在这里复制一个块吗?

Mic*_*son 6 objective-c objective-c-blocks

我知道你必须复制块才能让它们在堆栈帧退出后留下来.但是,这如何应用于嵌套块中使用的堆栈分配块,如下面的代码示例所示:

- doSomethingFunkyThenCall:(void(^)(int someValue))callback
{
    [[NSOperationQueue currentQueue] addOperationWithBlock:^{
        // ... do some work here, potentially nesting into further blocks ...
        callback(result);
    }];
}
Run Code Online (Sandbox Code Playgroud)

显然,doSomethingFunkyThenCall:堆栈帧将在执行回调之前终止,因此必须复制它.但是这会在调用中自动发生addOperationWithBlock:还是我必须手动执行?

joe*_*ick 0

是的,您应该callback = [[callback copy] autorelease];在此方法的顶部执行 a 操作。

块中使用的对象会自动保留,但发送堆栈块保留实际上不会执行任何操作(因为保留的语义要求它返回接收者),因此一旦我们离开创建它的框架,该对象就会消失。

来源:
http://cocoawithlove.com/2009/10/how-blocks-are-implemented-and.html http://thirdcog.eu/pwcblocks/#objcblocks

编辑:事实证明我错了。@bbum 在下面指出,Block_copy 将递归复制,并且由于addOperationWithBlock:复制它的块,因此回调也被复制。

  • 没有; 在这种情况下不需要复制块。当复制使用“addOperationWithBlock:”排队的块时(“NSOperationQueue”将执行此操作),它将复制封装的块。 (9认同)