我参与了我的项目,我必须用自定义类填充许多数组和字典。在此过程中,内存使用量开始增加。但最后当我使用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!
答案 0 :(得分:4)
使用“imageNamed:”创建的图像被缓存,如果没有其他人有强引用,那么操作系统会在认为这样做时发布它们。
这可以避免重复调用imageNamed:并且每次创建新图像的情况,这相当昂贵。