注册 登录
主题 : 为何ARC在for循环中无法自动释放?
级别: 圣骑士

状态: 连续签到 - [84天]
UID: 65410
精华: 0
发帖: 507
可可豆: 1959 CB
威望: 1768 点
在线时间: 1076(时)
注册时间: 2011-04-21
最后登录: 2019-03-22
0 楼:  发表于: 2019-03-08 23:34    发自: Web Page
来源于 一般提问 分类

为何ARC在for循环中无法自动释放?   

 秒速时时彩全天计划 www.ncbgdvft.cn 

    for (long i = 0; i <100000000000; i++) {
        NSNumber *num = [NSNumber numberWithLong:i];
        NSString *str = [NSString stringWithFormat:@"%ld ", i];
        NSString *xxx = [NSString stringWithFormat:@"%@%@", num, str];
        //xxx = nil;
    }



运行这段代码会使内存不断飙升,按道理变量xxx离开一个循环后(再下一次循环前),就应该自动释放,ARC此时为何表现如此愚昧??
上善若水,无欲则刚
级别: 新手上路
UID: 662541
精华: 0
发帖: 15
可可豆: 33 CB
威望: 33 点
在线时间: 71(时)
注册时间: 2018-10-03
最后登录: 2019-03-25
1 楼:  发表于: 2019-03-09 16:50    发自: Web Page
@autoreleasepool {
            NSNumber *num = [NSNumber numberWithLong:i];
            NSString *str = [NSString stringWithFormat:@"%ld ", i];
            NSString *xxx = [NSString stringWithFormat:@"%@%@", num, str];
        }

设定问题  
级别: 圣骑士

状态: 连续签到 - [153天]
UID: 527782
精华: 0
发帖: 654
可可豆: 1589 CB
威望: 1330 点
在线时间: 1571(时)
注册时间: 2015-12-01
最后登录: 2019-03-25
2 楼:  发表于: 2019-03-09 17:42    发自: Web Page
循环中创建的临时变量直到循环全部结束后才会释放,可以把循环体放在自动释放池中

for (long i = 0; i <100000000000; i++) {
    @autoreleasepool {
         // 循环体...
    }
}
我是老司机,专门吹牛逼!
级别: 圣骑士
UID: 136279
精华: 0
发帖: 518
可可豆: 867 CB
威望: 912 点
在线时间: 1368(时)
注册时间: 2012-04-13
最后登录: 2019-03-23
3 楼:  发表于: 2019-03-09 21:04    发自: Web Page
这面试不过关啊,autoreleasepool有妙用
级别: 侠客
UID: 511656
精华: 0
发帖: 116
可可豆: 157 CB
威望: 147 点
在线时间: 647(时)
注册时间: 2015-10-08
最后登录: 2019-03-11
4 楼:  发表于: 2019-03-10 09:20    发自: Web Page
NSString存放区域了解一下。不要引以为自己知识不足,怪Other愚昧
级别: 侠客
UID: 511656
精华: 0
发帖: 116
可可豆: 157 CB
威望: 147 点
在线时间: 647(时)
注册时间: 2015-10-08
最后登录: 2019-03-11
5 楼:  发表于: 2019-03-10 09:22    发自: Web Page
https://www.jianshu.com/p/462adf281fde,知识不够的人总是大言不惭
级别: 圣骑士
状态: 连续签到 - [15天]
UID: 526021
精华: 0
发帖: 659
可可豆: 1136 CB
威望: 1119 点
在线时间: 618(时)
注册时间: 2015-11-24
最后登录: 2019-03-25
6 楼:  发表于: 2019-03-10 12:25    发自: Web Page
因为没遇到自动释放池

你把代码改成这样试试
复制代码
  1. p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Menlo; color: #ffffff; background-color: #000000}span.s1 {color: #de38a5}span.s2 {color: #8b87ff}span.s3 {color: #00b1ff}span.s4 {color: #ff4647}span.s5 {color: #4bd156} for (long i = 0; i <100000000000; i++) {
  2. @autoreleasepool {
  3. NSNumber *num = [NSNumber numberWithLong:i];
  4. NSString *str = [NSString stringWithFormat:@"%ld ", i];
  5. NSString *xxx = [NSString stringWithFormat:@"%@%@", num, str];
  6. }
  7. //xxx = nil;
  8. }


级别: 侠客
UID: 534238
精华: 0
发帖: 74
可可豆: 264 CB
威望: 254 点
在线时间: 498(时)
注册时间: 2015-12-26
最后登录: 2019-03-25
7 楼:  发表于: 2019-03-11 09:12    发自: Web Page
for循环内创建的临时变量,是在for循环结束后才会被释放,加个autoReleasePool就好了
级别: 骑士

状态: 连续签到 - [237天]
UID: 558164
精华: 0
发帖: 299
可可豆: 1571 CB
威望: 1078 点
在线时间: 514(时)
注册时间: 2016-04-18
最后登录: 2019-03-25
8 楼:  发表于: 2019-03-11 10:11    发自: Web Page
[array enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        
    }];

或者用这个遍历,内部默认有autoreleasepool处理。
级别: 圣骑士

状态: 连续签到 - [84天]
UID: 65410
精华: 0
发帖: 507
可可豆: 1959 CB
威望: 1768 点
在线时间: 1076(时)
注册时间: 2011-04-21
最后登录: 2019-03-22
9 楼:  发表于: 2019-03-11 10:25    发自: Web Page
呵呵,搞不清楚你们怎么会觉得这很正常,在我看来这明明就是编译器不够完善导致的。。

上善若水,无欲则刚

CocoaChina社区转载内容已尽可能注明出处,如未能核实来源或转发内容图片有权利瑕疵的,请及时联系社区进行修改或删除【联系方式QQ : 3442093904 邮箱:support@www.ncbgdvft.cn】文章内容为作者独立观点,不代表CocoaChina社区立场。版权归原作者所有,如申请授权请联系作者,因文章侵权CocoaChina社区不承担任何法律及连带责任。

描述
快速回复

关注本帖(如果有新回复会站内信通知您)

发帖、回帖都会得到可观的积分奖励。查看论坛积分规则

按"Ctrl+Enter"直接提交
    顶部