是否有必要将__ block类型指定符用于在块中更改的可变对象



说映射是一个nsdictioanry,我的理解是因为RES的地址没有在块中变化,我们不需要为此使用__ block。它是否正确?

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

顺便说一句,我运行的代码正常运行。

__block类型指定符仅用于存储通常在堆栈上的可变项目。

由于不能仅保证仅在创建它的方法范围内调用一个块(称为逃脱),因此它可能需要突变变量,这些变量已在它们消失后引用。如果将块固定在原始方法或功能的末端,则引用堆栈上的事物(例如示例中的i)可能会变成悬空的指针,因此,如果要进行突变,则需要将它们存储在其他地方。比堆栈。__block规范仪告诉编译器将变量放入单独的存储中,每当块被调用时,该变量将是有效的。

对于分配堆的事物(例如上面的res),这不是必需的 - 因为只要对象在围绕对象(应该存在),指向对象的指针就不会改变),对象指针的本地存储不需要放入替代存储中,并且可以留在堆栈上。

如果您想了解更多信息,则块和变量文档页面在带有块的内存管理上具有深入的信息,以及有关__block存储类型的更多信息。

是正确的。仅当您将(=或等效)分配给块内部的变量时,或者如果您想屏蔽以便能够在创建块后向块外部的变量看到分配,则需要__block。(无论变量的类型是什么。)

在这里,变量i分配给块内部,使用++操作员,因此__block是必要的。变量res永远不会分配到任何地方;变量 res读取的(未分配给)。

最新更新