Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 是否可以在数组中存储一系列块代码,并在需要时执行?_Ios_Closures_Objective C Blocks - Fatal编程技术网

Ios 是否可以在数组中存储一系列块代码,并在需要时执行?

Ios 是否可以在数组中存储一系列块代码,并在需要时执行?,ios,closures,objective-c-blocks,Ios,Closures,Objective C Blocks,可能重复: 我正在编写一个应用程序,其中有时基于某些条件,我希望在某些事件发生后运行某些代码。当需要执行此代码时,此代码可以在多个位置访问函数中不在范围内的变量。 是否可以将这些语句作为块存储在数组中,并在事件发生时逐个执行。 如果是,如何访问上一个作用域的变量 我想把它做成一个闭包数组。你可以在块上使用Block\u copy函数将块移动到堆中,当你把它存储在数组中时,使用Block\u copy函数,当你完成它时,使用Block\u release函数。Block\u copy会将执行块变

可能重复:

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


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

你可以在块上使用Block\u copy函数将块移动到堆中,当你把它存储在数组中时,使用Block\u copy函数,当你完成它时,使用Block\u release函数。Block\u 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_copy函数将块移动到堆中,当您使用完块时,可以在块上使用Block_release函数。Block\u 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);

正如@foggzilla所说,在将块放入NSMutableArray或类似的数组之前,需要先复制它

e、 g

复制选择器直接映射到Block_copy函数,因此无需使用该函数。如果使用ARC,则无需释放块


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

正如@foggzilla所说,在将其放入NSMutableArray或类似阵列之前,需要复制该块

e、 g

复制选择器直接映射到Block_copy函数,因此无需使用该函数。如果使用ARC,则无需释放块


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

如何使用块释放和块复制?我需要声明所有用作_块的变量吗?我将用示例代码更新我的答案。除非需要变量可变,否则不需要将变量声明为u块。如何使用块释放和块复制?我需要声明所有用作_块的变量吗?我将用示例代码更新我的答案。您不需要将变量声明为_块,除非您需要这些变量是可变的。嘿,如果块引用其他函数的局部变量,是否可以?如果局部变量在定义块的范围内,则可以-并且您需要向它们添加块存储类型,例如_弱或_强。如果访问类的成员变量,块将保留self,这样也可以。如果不小心,这可能会导致泄漏。并且,只有在需要为其赋值时,才需要向其添加块存储类型。如果块引用其他函数的局部变量,可以吗?如果局部变量在定义块的范围内,它们就可以了,并且您需要向它们添加块存储类型,例如_弱或_强。如果访问类的成员变量,块将保留self,这样也可以。如果不小心,这可能会导致泄漏。只有在需要分配给块存储类型时,才需要向它们添加块存储类型。可能,但它没有说明属于这些块的外部函数范围的局部变量将如何保留。可能,但它没有说明属于这些块的局部变量如何保留将保留这些区块的外部功能范围。