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

Objective c iOS-NSMutableArray removeAllObjects不释放内存(ARC),objective-c,memory-leaks,nsmutablearray,Objective C,Memory Leaks,Nsmutablearray,我在我的项目中有一个部分,我必须用自定义类填充许多数组和字典。当然,在这个过程中,内存使用量开始增加。但在最后,当我使用removeAllObjects从任何地方删除项时,内存使用量保持在相同的水平,而不是降低到起始值 我制作了一个简化的代码,当然没有意义,但复制了我得到的原始版本: 标题: @interface ViewController : UIViewController @property (strong, nonatomic) NSMutableArray *imageArray;

我在我的项目中有一个部分,我必须用自定义类填充许多数组和字典。当然,在这个过程中,内存使用量开始增加。但在最后,当我使用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
@实现视图控制器
....
-(iAction)开始:(id)发送方
{
[自加载指示器启动激活];
self.timer=[NSTimer scheduledTimerWithTimeInterval:0.1目标:自选择器:@selector(addImages)userInfo:nil repeats:YES];
}
-(iAction)停止:(id)发送方
{
[自加载指示器停止设置动画];
[自动定时器失效];
[self.imageArray removeAllObjects];
}
-(无效)添加图像
{
int i=0;
而(i<500)
{
UIImage*image=[UIImage ImageName:@“test.png”];
[self.imageArray addObject:image];
i++;
}
}
...
@结束
问题:

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

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

使用“ImageName:”创建的图像会被缓存,如果没有其他人有强引用,那么操作系统会在认为这样做是个好主意时释放它们

这避免了在每次创建新图像时重复调用imageNamed:的情况,这相当昂贵

使用“ImageName:”创建的图像会被缓存,如果没有其他人有强引用,那么操作系统会在认为这样做是个好主意时释放它们


这避免了在每次创建新图像时重复调用imageNamed:的情况,这相当昂贵

您是否在模拟器中尝试过“触发内存警告”,以查看内存是否仅在内存压力时释放?或者,当你通过创建一个新的数组来重置数组,或者仅仅将nil赋值给self.imageArrai时,会发生什么呢?我现在在模拟器上尝试过,奇怪的是,它工作得很好,从列表中删除所有对象后,内存使用量会降低到原始值,甚至不会触发内存警告。所以问题是,为什么这种行为在真实设备上有所不同?顺便说一句,重置阵列或设置为零会产生相同的行为。您是否在模拟器中尝试过“触发内存警告”,以查看内存是否仅在内存压力时释放?或者,当你通过创建一个新的数组来重置数组,或者仅仅将nil赋值给self.imageArrai时,会发生什么呢?我现在在模拟器上尝试过,奇怪的是,它工作得很好,从列表中删除所有对象后,内存使用量会降低到原始值,甚至不会触发内存警告。所以问题是,为什么这种行为在真实设备上有所不同?顺便说一句,将数组重置或设置为nil会产生相同的行为。我知道你是对的(也投了赞成票),我不想对此提出任何异议,但我不知道这是否完全解释了这里发生的事情。请注意,在此特定示例中,同一文件在循环中加载500次。它应该在这个循环的第一次迭代中被缓存,对吗?所以除非这个文件很大,否则我不认为这就是全部的解释。(并不是说我有一个更好的…)在原始环境中,我不在阵列中使用图像,instad我使用客户类,所以我不认为这只是缓存“imageNamed”。我知道你是对的(也投了更高的票),我不想对此提出异议,但我不知道这是否完全解释了这里发生的事情。请注意,在此特定示例中,同一文件在循环中加载500次。它应该在这个循环的第一次迭代中被缓存,对吗?所以除非这个文件很大,否则我不认为这就是全部的解释。(并不是说我有一个更好的…)在原始环境中,我不在数组中使用图像,instad我使用客户类,所以我不认为这只是缓存“imageNamed”。