解决方案 »

  1.   

    放到自动释放池里面:- (IBAction)action:(id)sender {
        int i=10000;
        NSString * data;
        dispatch_queue_t queue = dispatch_queue_create("com.wang.queue", NULL);
        while(i>0)
        {
            @autoreleasepool {
                data = [[NSString alloc]initWithFormat:@"%i",i];
                NSString * str = data;
                dispatch_async(queue, ^{{
                    [self print:str];
                }});
                i--;
            }
        }
        
    }-(void) print:(NSString*)str
    {
        NSLog(@"%@",str);
        str = nil;
    }
      

  2.   

    加到autoreleasepool之后,内存还是没降下来:程序开始,内存为20.3Mb点了按钮执行结束后,内存没降,保持61.7Mb:
    另外,对于autoreleasepool的原理,看了一些博客,还是不太懂。
    很多都说,当pool被释放时,pool中所有的对象都会被调用release。这里的“pool中所有的对象”指的是哪些?是指在autoreleasepool中alloc的,还是指哪些?
      

  3.   

    使用并行的dispatch_apply 试试你的这个循环操作,再观察一下内存的占用
    - (IBAction)action:(id)sender {
            int i=10000;
            dispatch_async(dispatch_get_global_queue(0, 0), ^(){
            dispatch_apply(i, dispatch_get_global_queue(0, 0), ^(size_t index){
                  NSLog(@"index is :%d",index);   //////
            });
            NSLog(@"done");
        });
    }因为是并行操作,上面输出的index 是无序的
      

  4.   

    我觉得真机上也许就会释放了     我现在运行的同一个app    模拟器上显示占用的内存比真机实际运行占用的内存多得多   但是真机没那么多我也就不管了  
      

  5.   

    4楼的方法跟内存释放好像没什么关系,我觉得还是autolayoutpool的问题
      

  6.   

    你这个data在释放池中alloc了,出了自动释放池也不会释放掉啊,直接用NSString *str = [NSString stringWithFormat:@"", ] ,用便利构造器(里面有个autoreleas),自动释放池才会起作用
      

  7.   

    不会,这里的data还是会被释放,因为虽然自动释放池不会释放data,但是也相当于给data加入了一个作用域,编译器会自动插入release代码:@autoreleasepool {
                data = [[NSString alloc]initWithFormat:@"%i",i];
                NSString * str = data;
                dispatch_async(queue, ^{{
                    [self print:str];
                }});
                i--;
                // [data release];
    }
      

  8.   

    用weak 
    block里面的self可能处在循环引用,
      

  9.   


    试过了,像下面的代码,改了弱引用也一样,内存还是减不下来:- (IBAction)action:(id)sender {
        int i=10000;
        NSString * data;
        dispatch_queue_t queue = dispatch_queue_create("com.wang.queue", NULL);
        __weak ViewController*  weakSelf = self;
        while(i>0)
        {
            @autoreleasepool {
                data = [[NSString alloc]initWithFormat:@"%i",i];
                NSString * str = data;
                dispatch_async(queue, ^{
                    [weakSelf print:str];
                });
                i--;
            }
        }
        
    }
      

  10.   


    照你的方法改了,内存没减下来:下面的图片是连续点了5次button,全部运行完之后的内存情况,占用很大的内存,此时并没有“com.wang.queue”这个线程:
    用instruments 观察内存状况,主要集中在“VM:performance tool data”这一项:
    详细看是这样的:
    所以我觉得data的内存是已经释放了,但是用于维持线程的一些东西却一直存在。却不知这些占用内存的究竟是什么?也不知
    我的理解对不对。
      

  11.   


    照你的方法改了,内存没减下来:下面的图片是连续点了5次button,全部运行完之后的内存情况,占用很大的内存,此时并没有“com.wang.queue”这个线程:
    用instruments 观察内存状况,主要集中在“VM:performance tool data”这一项:
    详细看是这样的:
    所以我觉得data的内存是已经释放了,但是用于维持线程的一些东西却一直存在。却不知这些占用内存的究竟是什么?也不知
    我的理解对不对。
    说实话,我在ARC下看内存真的没有特别准过。。