测试代码:
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSString *var = @"";
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(9 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
NSLog(@"%@",var);
NSObject *var = @"";
NSLog(@"%@",var);
});
}
return 0;
}
并重写为C ++:
static void __main_block_func_0(struct __main_block_impl_0 *__cself) {
NSString *var = __cself->var; // bound by copy
NSLog((NSString*)&__NSConstantStringImpl__var_folders_n0_4hrn9qgn3blbbt6ybq79lzt00000gn_T_main_e76f89_mi_2,var);
NSObject *var = (NSString *)&__NSConstantStringImpl__var_folders_n0_4hrn9qgn3blbbt6ybq79lzt00000gn_T_main_e76f89_mi_3;
NSLog((NSString *)&__NSConstantStringImpl__var_folders_n0_4hrn9qgn3blbbt6ybq79lzt00000gn_T_main_e76f89_mi_4,var);
}
所以我为什么要重新定义var
在块范围内?
我认为这种情况不适用于C ++中的local var
和global var
。
感谢您的帮助或讨论〜
您总是可以在当前作用域中定义与更广泛范围的某些变量具有相同名称的变量。并且当您这样做时,对该名称的后续引用将引用本地范围的变量。这不仅适用于调度块,还可以使用任何大括号,例如以下内容,就局部变量的作用域而言,其行为与您的GCD示例相同。
NSString *var = @"foo";
if (true) {
NSLog(@"%@", var); // foo
NSObject *var = [[NSObject alloc] init];
NSLog(@"%@", var); // <NSObject: 0x600012345678>
}
顺便说一下,您可以打开一个构建设置“隐藏的局部变量”:
然后,当您在代码中遇到此模式时,它将生成警告: