2

可能的重复:
将块存储在数组中

我正在编写一个应用程序,有时我想在某些事件发生后根据某些条件运行某些代码。当需要执行此代码时,此代码可能在多个位置访问不在作用域内的函数中的变量。是否可以将这些语句作为块存储在数组中,并在事件发生时一一执行。如果是,我如何访问前一个范围的变量?

我想把它做成一个闭包数组。

4

2 回答 2

2

Block_copy当您将块存储在数组中并完成处理时,您可以通过使用块上的函数将块移动到堆中Block_releaseBlock_copy会将执行块变量移动到堆中,这样当您继续运行应用程序时,变量不会在堆栈内存中被覆盖。

使用 Block_copy 的示例。你需要先做一个桥接

像这样在标题中为您的块类型定义一个 typedef。此类型示例没有参数。

typedef void (^myBlockType)();

当您想向数组中添加一个块时,您可以像这样复制该块:

- (void)addBlock:(void (^)())aBlock
{
        [mutableBlockArray addObject:(__bridge myBlockType)Block_copy((__bridge void *)aBlock)];
}

完成块后,您需要像这样释放它(ARC 不需要):

id finishBlock = [mutableBlockArray objectAtIndex:index]
Block_release((__bridge void *)finishBlock);
于 2012-11-19T21:14:26.880 回答
2

正如@foggzilla 所说,您需要先复制该块,然后才能将其放入 NSMutableArray (或类似的)中。

例如

[myArray addObject:[myBlock copy]];

The copy selector maps straight onto the Block_copy function, so there's no need to use that. AFAIK you don't need to release the block if you're using ARC.

You must always copy the block before putting it in a collection.

于 2012-11-19T21:28:21.343 回答