objective-c – 奇怪的__block存储变量崩溃

我的代码中有一个问题,我已经提炼到以下(愚蠢)的例子

NSArray *array = [NSArray arrayWithObjects:@"1", @"2", @"3", nil];

__block NSString *a = @"-1";

[array enumerateObjectsUsingBlock:^(id whoCares, NSUInteger idx, BOOL *stop) {
    a = [NSString stringWithFormat:@"%@ %d", a, idx];
    NSLog(@"%@", a);
}];

NSLog(@"%@", a);

这段代码有效,但如果我注释掉第一个NSLog(在块中)代码崩溃了.但是,如果我将格式字符串更改为以下内容

a = [NSString stringWithFormat:@"%d", idx];

然后代码运行正常,没有块内的NSLog.

这里发生了什么?我希望我只是误解了一些事情.

最佳答案 stringWithFormat:为您提供一个自动释放的对象,您不会保留该对象.当块退出并且您调用NSLog时,可能已经取消分配.

一种解决方案可能是使用可变字符串并每次附加到它而不是重新分配.

NSArray *array = [NSArray arrayWithObjects:@"1", @"2", @"3", nil];

NSMutableString *a = [NSMutableString stringWithFormat:@"-1"];

[array enumerateObjectsUsingBlock:^(id whoCares, NSUInteger idx, BOOL *stop) {
    [a appendFormat:@" %d", idx];
}];

NSLog(@"%@", a);
点赞