2015-04-03 143 views
0

我在我的项目中有一部分,我必须用自定义类填充许多数组和字典。在此过程中,内存使用量开始增加。但最后,当我使用removeAllObjects从各处删除项目时,内存使用率保持在同一级别,而不是减少到初始值。iOS - NSMutableArray removeAllObjects不释放内存(ARC)

我做了一个简单的代码不使课程的意义,而是再现我得到了原来的问题:

页眉:

@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分钟后内存使用增加f ROM从3.9 MB到58 MB。这很好,但是当我调用停止时,在调用removelAllObjects时,它仍然保持相同的值,即58 MB。

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

+0

您是否尝试过模拟器中的“触发内存警告”以查看内存是否仅在内存压力时才释放?或者当你通过创建一个新的数组来重置数组时,会发生什么,或者只是将nil赋给self.imageArray – rist 2015-04-03 17:12:21

+0

我现在在模拟器上尝试过了,奇怪的是它在完全移除后,从列表中删除所有对象后,内存使用量减少即使没有触发记忆警告也能达到原始值。所以这个问题为什么这种行为在真实设备上有所不同?顺便说一句,重置数组或设置为零产生相同的行为。 – 2015-04-07 12:20:20

回答

4

使用“imageNamed:”创建的图像被缓存,如果没有其他人拥有强大的引用,那么操作系统会在它觉得这是一个好主意时释放它们。

这样可以避免您重复调用imageNamed的情况,并且每次创建新图像时都很贵。

+0

我知道你是对的(upvoted它也是),并没有打算争执,但我不知道它是否完全解释了这里发生了什么。请注意,在这个特定的例子中,同一个文件在循环中加载了500次。它应该通过这个循环的第一次迭代被缓存,对吗?所以除非这个文件很大,我不认为这是完整的解释。 (并不是说我有一个更好的..) – Jef 2015-04-03 21:09:23

+0

在原始环境中,我不使用数组中的图像,instad我使用客户类,所以我不认为这只是关于缓存“imageNamed”。 – 2015-04-07 12:22:05