简述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
修饰符。