我使用 Xcode 4.2 和 ARC 写了以下代码,但在理解如何将块从栈拷贝到堆之前。
-(void) downloadWithBlock:(void (^)(void))callbackBlock;
{
// start the data download in the background...
NSOperation *backgroundOperation = [NSBlockOperation blockOperationWithBlock:^{
// synchronous download code
}];
[backgroundOperationQueue addOperation:backgroundOperation];
NSOperation *foregroundOperation = [NSBlockOperation blockOperationWithBlock:^{
callbackBlock();
}];
[foregroundOperation addDependency:backgroundOperation];
[[NSOperationQueue mainQueue] addOperation:foregroundOperation];
}
这段代码可以工作,但我不信任它,因为我不理解它。在另一段代码的某个部分中,当调用存储在ivars中的block时没有使用-copy导致应用程序崩溃。这让我想知道是否应该像这样重写这段代码:
-(void) downloadWithBlock:(void (^)(void))callbackBlock;
{
void(^heapBlock)(void) = [callbackBlock copy];
// start the data download in the background...
NSOperation *backgroundOperation = [NSBlockOperation blockOperationWithBlock:^{
// synchronous download code
}];
[backgroundOperationQueue addOperation:backgroundOperation];
NSOperation *foregroundOperation = [NSBlockOperation blockOperationWithBlock:^{
heapBlock();
}];
[foregroundOperation addDependency:backgroundOperation];
[[NSOperationQueue mainQueue] addOperation:foregroundOperation];
}
我的唯一关注点是更好地了解块指针的工作原理。这两个代码段中有哪一个是可接受的?在一个块内调用另一个块会触发编译器插入隐藏的Block_copy操作吗?