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:还是我必须手动执行?
是的,您应该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:复制它的块,因此回调也被复制。