加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 07:26:24 所属栏目:百科 来源:网络整理
导读:我的代码中有一个问题,我已经提炼到以下(愚蠢)的例子 NSArray *array = [NSArray arrayWithObjects:@"1",@"2",@"3",nil];__block NSString *a = @"-1";[array enumerateObjectsUsingBlock:^(id whoCares,NSUInteger idx,BOOL *stop) { a = [NSString stringW
我的代码中有一个问题,我已经提炼到以下(愚蠢)的例子

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",nil];

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

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

NSLog(@"%@",a);

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读