说映射是一个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
是读取的(未分配给)。