ios - 是否可以将一系列 block 代码存储在数组中并在需要时执行它?

标签 ios closures objective-c-blocks

Possible Duplicate:
Storing Blocks in an Array

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

我想将其作为闭包数组。

最佳答案

当您将 block 存储在数组中时,您可以使用 block 上的 Block_copy 函数将 block 移动到堆中,并在使用完毕后使用 Block_release 函数。 Block_copy 会将执行 block 变量移动到堆中,这样当您继续运行应用程序时,变量就不会在堆栈内存中被覆盖。

使用 Block_copy 的示例。您需要先进行桥接

在 header 中为 block 类型定义 typedef,如下所示。此类型示例没有参数。

typedef void (^myBlockType)();

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

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

当你完成该 block 后,你需要像这样释放它(ARC 不需要):

id finishBlock = [mutableBlockArray objectAtIndex:index]
Block_release((__bridge void *)finishBlock);

关于ios - 是否可以将一系列 block 代码存储在数组中并在需要时执行它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13462045/

相关文章:

ios - NSOperationQueue mainQueue 是串行的还是并发的?

powershell - 如何在Powershell block /闭包参数中使用变量

javascript - 如何在递归函数中使用闭包而不丢失 JavaScript 的作用域?

ios - 使用ObjC block 作为CGDataProviderCreateWithData的回调

objective-c - [myArray 添加对象 :[[objcBlock copy] autorelease]] crashes on dealloc'ing the array

ios - KVO 在 iOS 9.3 中损坏

ios - NSURLSessionConfiguration 不接受 HTTPAdditionalHeaders 中的 'Content type'

iOS8 和 Safari 不再支持蓝牙扫描仪

rust - 可变地借用一个结构字段,同时在闭包中借用另一个

concurrency - 使用 dispatch_async 的 EXC_BAD_ACCESS