UICollectionView内存泄漏

时间:2014-07-14 22:09:23

标签: ios objective-c

一旦我的应用程序在物理设备上进行测试,我就会遇到内存泄漏问题。滚动UiCollectioView dow时出现问题,但在加载此视图控制器时速度也很慢。

所以我要做的就是使用NSFileManger直接从位于此路径/ var / mobile / Media / DCIM / 100APPLE /的iPhone中的DCIM文件加载图像。获取这些图像后,我将它们放入一个数组中,并通过UICollectionView创建一个带有它们的图库,方法是用数组中的图像列表填充每个单元格。例如,单元1 =图像1,单元2 =图像2,依此类推。这可以正常工作,但当滚动意外但强有力地崩溃所以我因此假设这是一个内存泄漏问题。特别是当模拟器上没有出现此问题时。

这是我的代码:

    - (void)viewDidAppear:(BOOL)animated
    {
        // Do any additional setup after loading the view from its nib.
        path = @"/var/mobile/Media/DCIM/100APPLE/";
        Images = [[[NSFileManager defaultManager] contentsOfDirectoryAtPath:path error:nil]mutableCopy];
    }

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

    if ([[[Images objectAtIndex:indexPath.row]pathExtension] isEqualToString:@"JPG"])
    {
    [collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:@"Cell"];

    static NSString *identifier = @"Cell";

    UICollectionViewCell *cell=[collectionView dequeueReusableCellWithReuseIdentifier:identifier forIndexPath:indexPath];

    cell.backgroundView = [[UIImageView alloc] initWithImage:[UIImage imageWithData:[NSData dataWithContentsOfFile:[NSString stringWithFormat:@"%@%@", path, [Images objectAtIndex:indexPath.row]]]]];


    UIView *v = [[UIView alloc]initWithFrame:CGRectMake(0, 80, cell.bounds.size.width, 20)];
    v.backgroundColor = [[UIColor blackColor]colorWithAlphaComponent:0.4f ];

    UILabel *title = [[UILabel alloc]initWithFrame:CGRectMake(0, 70, cell.bounds.size.width, 40)];
    title.tag = 200;
    title.text = [Images objectAtIndex:indexPath.row];
    title.textColor = [UIColor whiteColor];
    [cell.contentView addSubview:v];
    [cell.contentView addSubview:title];
    return cell;
    }
    else
        [collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:@"Cell"];

    static NSString *identifier = @"Cell";

    UICollectionViewCell *cell=[collectionView dequeueReusableCellWithReuseIdentifier:identifier forIndexPath:indexPath];
    return cell;
}


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

提前致谢...

PS: 我的应用程序是作为越狱手机的应用程序构建的,所以请不要告诉我苹果不会接受我这样做的方式。

1 个答案:

答案 0 :(得分:1)

首先,你不应该假设你有内存泄漏,因为它在使用ARC时非常罕见;你应该用仪器来测试。您有一个问题,即您在滚动时已将视图,v和标签,标题添加到已拥有它们的单元格,并且会重复使用单元格。这很可能是你的问题。就个人而言,我认为在cellForItemAtIndexPath中添加子视图是不好的形式,除非您将它们添加到某些单元格而不是基于indexPath的其他单元格。您应该创建一个自定义单元格,并在其init方法(或IB)中添加子视图。此外,您只需要注册一次类,因此它不应该在cellForItemAtIndexPath中;放置它的更好的地方是viewDidLoad。