gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 19:46:49 24 4
gpt4 key购买 nike

我的代码中有一个问题,我已将其提炼为以下(愚蠢的)示例

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(在 block 内),代码就会崩溃。但是,如果我将格式字符串更改为以下内容

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

然后代码在 block 中没有 NSLog 的情况下运行正常。

这是怎么回事?我希望我只是误会了什么。

最佳答案

stringWithFormat: 为您提供一个自动释放的对象,您不会保留该对象。当 block 退出并且您调用 NSLog 时,a 可能已经被释放。

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

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);

关于objective-c - 奇怪的 __block 存储变量崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6865800/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com