【问题标题】:Is it possible to store a series of block code in an array and execute it when required? [duplicate]是否可以将一系列块代码存储在一个数组中并在需要时执行它? [复制]
【发布时间】:2012-11-19 20:54:07
【问题描述】:

可能重复:
Storing Blocks in an Array

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

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

【问题讨论】:

  • 也许可以,但它没有讨论如何保留属于这些块的外部函数范围的局部变量。

标签: ios closures objective-c-blocks


【解决方案1】:

您可以在将块存储在数组中时使用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);

【讨论】:

  • 如何使用 block_release 和 block_copy ?我需要声明所有用作 __block 的变量吗?
  • 我将使用示例代码更新我的答案。除非您需要这些变量是可变的,否则您不需要将变量声明为 __block。
【解决方案2】:

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

例如

[myArray addObject:[myBlock copy]];

复制选择器直接映射到 Block_copy 函数,所以没有必要使用它。 AFAIK 如果您使用 ARC,则无需释放块。

必须在将块放入集合之前始终复制它。

【讨论】:

  • 嘿,如果块引用其他函数的局部变量,可以吗?
  • 局部变量很好,只要它们在定义块的范围内 - 您需要向它们添加块存储类型(例如 __weak 或 __strong)。如果您访问该类的成员变量,该块将保留 self ,这样也可以。如果您不小心,这可能会导致泄漏。
  • “并且你需要给它们添加块存储类型”只有当你需要分配给它们时
猜你喜欢
  • 1970-01-01
  • 2014-10-05
  • 1970-01-01
  • 1970-01-01
  • 2017-12-11
  • 1970-01-01
  • 1970-01-01
  • 2012-09-27
  • 1970-01-01
相关资源
最近更新 更多