Objective c 对于在块中更改的可变对象,是否有必要使用_块类型说明符?

Objective c 对于在块中更改的可变对象,是否有必要使用_块类型说明符?,objective-c,block,Objective C,Block,假设map是一个字典,我的理解是,因为res的地址在块中没有改变,所以我们不需要使用u块。这是正确的吗 //__block NSMutableArray *res = [@[] mutableCopy]; NSMutableArray *res = [@[] mutableCopy]; __block NSInteger i = 0; [map enumerateKeysAndObjectsUsingBlock:^(NSString *key, NSArray *v, BOOL *stop) {

假设map是一个字典,我的理解是,因为res的地址在块中没有改变,所以我们不需要使用u块。这是正确的吗

//__block NSMutableArray *res = [@[] mutableCopy];
NSMutableArray *res = [@[] mutableCopy];
__block NSInteger i = 0;
[map enumerateKeysAndObjectsUsingBlock:^(NSString *key, NSArray *v, BOOL *stop) {
    [res addObject:v];
    i++;
}];

顺便说一句,我已经运行了代码,它运行得很好。

类型说明符仅用于存储通常会放在堆栈上的可变项

由于不能保证只在创建块的方法的范围内调用块(这称为转义),因此可能需要在它们消失后对其引用的变量进行变异。如果块保持在原始方法或函数的末尾,那么对堆栈上的内容的引用(如示例中的
i
)可能会成为悬空指针,因此如果要对它们进行变异,则需要将它们存储在堆栈以外的某个位置。
\u块
说明符告诉编译器将变量放在单独的存储器中,该存储器在调用块时有效

对于堆分配的东西(如上面的
res
),这是不必要的-因为只要对象在周围,指向对象的指针就不会改变(应该改变,因为块默认会保留它),对象指针的本地存储不需要放在备用存储中,并且可以留在堆栈上


如果您想了解更多信息,文档页面将提供有关内存管理和块的详细信息,以及有关存储类型的更多信息。

类型说明符仅用于存储通常在堆栈上的可变项

由于不能保证只在创建块的方法的范围内调用块(这称为转义),因此可能需要在它们消失后对其引用的变量进行变异。如果块保持在原始方法或函数的末尾,那么对堆栈上的内容的引用(如示例中的
i
)可能会成为悬空指针,因此如果要对它们进行变异,则需要将它们存储在堆栈以外的某个位置。
\u块
说明符告诉编译器将变量放在单独的存储器中,该存储器在调用块时有效

对于堆分配的东西(如上面的
res
),这是不必要的-因为只要对象在周围,指向对象的指针就不会改变(应该改变,因为块默认会保留它),对象指针的本地存储不需要放在备用存储中,并且可以留在堆栈上


如果您想阅读更多关于这方面的内容,文档页面提供了有关内存块管理的深入信息,以及有关存储类型的更多信息。

这是正确的<代码>\u块仅当您将(
=
或等效项)分配给块内的变量时,或者如果您希望块在创建块后能够看到块外变量的分配时,才需要。(无论变量的类型是什么,这都是正确的。)


这里,变量
i
通过
++
运算符分配给块内部,因此需要
\u块
。变量
res
从未分配到任何位置;变量
res
从块内读取(未分配到)。

这是正确的<代码>\u块仅当您将(
=
或等效项)分配给块内的变量时,或者如果您希望块在创建块后能够看到块外变量的分配时,才需要。(无论变量的类型是什么,这都是正确的。)


这里,变量
i
通过
++
运算符分配给块内部,因此需要
\u块
。变量
res
从未分配到任何位置;变量
res
是从块内读取的(未分配给)。

编译器是否抱怨?运行代码并打印
res
。发生了什么?我已经运行了它,它运行得很好,然后答案是:否:-)编译器会告诉您是否缺少
\uuu块
。顺便说一句,没有真正的理由使用
[@[[]mutableCopy]
-它不比
[NSMutableArray]
快,而且读起来也不太清晰。编译器有抱怨吗?运行代码并打印
res
。发生了什么?我已经运行了它,它运行得很好,然后答案是:否:-)编译器会告诉您是否缺少
\uu块
。顺便说一句,没有真正的理由使用
[@[[]mutableCopy]
-它不比
[NSMutableArray]
快,而且读起来不太清晰。