iOS - NSMutableArray removeAllObjects不释放内存(ARC)

时间:2015-04-03 16:37:58

标签: objective-c memory-leaks nsmutablearray

我参与了我的项目,我必须用自定义类填充许多数组和字典。在此过程中,内存使用量开始增加。但最后当我使用removeAllObjects从任何地方删除项目时,内存使用量保持在同一级别而不是降低到起始值。

我制作了一个简单的代码,当然没有意义,但重现了我得到的原始问题:

部首:

@interface ViewController : UIViewController

@property (strong, nonatomic) NSMutableArray *imageArray;
@property (strong, nonatomic) NSTimer *timer;

- (IBAction)start:(id)sender;
- (IBAction)stop:(id)sender;

@end

实现:

@implementation ViewController
....

- (IBAction)start:(id)sender
{
    [self.loadingIndicator startAnimating];
    self.timer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(addImages) userInfo:nil repeats:YES];
}

- (IBAction)stop:(id)sender
{
    [self.loadingIndicator stopAnimating];
    [self.timer invalidate];
    [self.imageArray removeAllObjects];
}

- (void)addImages
{
    int i = 0;

    while (i < 500)
    {
        UIImage *image = [UIImage imageNamed:@"test.png"];
        [self.imageArray addObject:image];
        i++;
    }
}
...
@end

问题:

当我呼叫开始时,1分钟后内存使用量从3.9 MB增加到58 MB。这很好,但是当我调用stop,调用removelAllObjects时,它仍然是相同的值,58 MB。

我做错了什么?我正在使用ARC!

1 个答案:

答案 0 :(得分:4)

使用“imageNamed:”创建的图像被缓存,如果没有其他人有强引用,那么操作系统会在认为这样做时发布它们。

这可以避免重复调用imageNamed:并且每次创建新图像的情况,这相当昂贵。