为什么要重新定义在objc的块外捕获的变量?

问题描述 投票:0回答:1

测试代码:

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 varglobal var

感谢您的帮助或讨论〜

objective-c objective-c-blocks
1个回答
0
投票

您总是可以在当前作用域中定义与更广泛范围的某些变量具有相同名称的变量。并且当您这样做时,对该名称的后续引用将引用本地范围的变量。这不仅适用于调度块,还可以使用任何大括号,例如以下内容,就局部变量的作用域而言,其行为与您的GCD示例相同。

NSString *var = @"foo";
if (true) {
    NSLog(@"%@", var);                        // foo
    NSObject *var = [[NSObject alloc] init];
    NSLog(@"%@", var);                        // <NSObject: 0x600012345678>
}

顺便说一下,您可以打开一个构建设置“隐藏的局部变量”:

enter image description here

然后,当您在代码中遇到此模式时,它将生成警告:

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.