没有为大图像的UICollectionView发布内存

时间:2014-07-22 15:25:10

标签: memory-management uiimage nsmutablearray automatic-ref-counting uicollectionview

我有一个包含15个元素的NSMutableArray,它们都是字符串。字符串是指本地存储在应用程序中的图像名称(每个图像大约640x640)。我在UICollectionView中显示图像数组。

当我重新加载collectionView以显示图像时,我的内存使用量会随着你所期望的那样显示出来(虽然它的足迹比我预期的要大得多)。

真正的问题是这些图像使用的内存永远不会被释放。因此,尽管我从数组中删除了所有对象,删除了collectionView并将所有内容设置为nil,但没有任何内存被释放。

这是为什么?如果我删除了这些对象并删除了ViewController,我希望我的记忆恢复到原来的水平。

更新:代码段

ViewController.m

@implementation ViewController

static NSString *CellIdentifier = @"photoCell";

-(void)viewDidLoad{

    [super viewDidLoad];

    self.photoCollectionView = [[UICollectionView alloc] initWithFrame:CGRectMake(0,0, self.view.frame.size.width, 320) collectionViewLayout:self.photoSpringFlowLayout];
    [self.photoCollectionView setDataSource:self];
    [self.photoCollectionView setDelegate:self];
    [self.view addSubview:self.photoCollectionView];
    [self.photoCollectionView registerClass:[PhotoPreviewCell class] forCellWithReuseIdentifier:CellIdentifier];

    self.imagesAray = [[NSMutableArray alloc] initWithObjects:@"photo1", @"photo2", @"photo3", @"photo4", @"photo5", @"photo6", @"photo7", @"photo8", @"photo9", @"photo10", @"photo11", @"photo12", @"photo13", @"photo14", @"photo15", nil];

    [self.photoCollectionView reloadData];
}


#pragma mark - UICollectionView Methods

-(NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView{
    return 1;
}

-(NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section{
    return self.imagesArray.count;
}

-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{

    PhotoPreviewCell *cell = (PhotoPreviewCell*)[collectionView dequeueReusableCellWithReuseIdentifier:CellIdentifier forIndexPath:indexPath];

    NSString *imageName = self.imagesArray[indexPath.row];
    [cell.photoImage setImage:[UIImage imageNamed:imageName]];

    return cell;

}

PhotoPreviewCell.m

@implementation PhotoPreviewCell

-(id)initWithFrame:(CGRect)frame{

    self = [super initWithFrame:frame];

    if(self){

        self.photoImage = [[UIImageView alloc] init];
        self.photoImage.frame = CGRectMake(0, 0, 160, 160);
        self.photoImage.contentMode = UIViewContentModeScaleAspectFit;
        [self.contentView addSubview:self.photoImage];

    }

    return self;
}

1 个答案:

答案 0 :(得分:2)

好的原因是从闪存中加载图像需要一些时间,操作系统会尝试避免加载它,因此它会缓存加载的图像。它们仅在您使用imageNamed:方法时进行缓存。如果您正在测试模拟器上发布所有对象并尝试模拟内存警告。这应该强制操作系统从缓存中删除未使用的图像。