跳到主要内容

简述block在修改NSMutableArray,需不需要添加__block ? ?

参考答案:

在 Objective-C 中,当你在一个 block 内部需要修改一个外部变量(如一个 NSMutableArray),通常情况下你需要在该变量前面添加 __block 修饰符。__block 告诉编译器这个变量可能会在 block 内部被修改,因此它需要在堆上而不是栈上分配内存,以确保在 block 执行期间变量的值保持有效。

例如,如果你有一个 NSMutableArray 并且你想在一个 block 内部修改它,你需要这样做:

NSMutableArray *mutableArray = [NSMutableArray arrayWithObjects:@"Object 1", @"Object 2", nil];

__block NSMutableArray *blockMutableArray = MutableArray;

dispatch_async(dispatch_get_main_queue(), ^{
    [blockMutableArray addObject:@"Object 3"];
});

在这个例子中,__block 修饰符使得 blockMutableArray 可以在 block 内部被修改。如果不加 __block,编译器会报错,因为它默认假设 block 内部的变量是只读的。

然而,如果你只是读取外部变量而不修改它,那么就不需要添加 __block 修饰符。例如,如果你只是遍历数组而不添加或删除元素,那么不需要 __block

NSMutableArray *MutableArray = [NSMutableArray arrayWithObjects:@"Object 1", @"Object 2", nil];

dispatch_async(dispatch_get_main_queue(), ^{
    for (NSString *object in MutableArray) {
        NSLog(@"%@", object);
    }
});

在这个例子中,我们没有修改 MutableArray,所以不需要使用 __block 修饰符。