在我的应用程序中使用自定义 UICollectionViewCell 时如何停止内存警告

Posted

技术标签:

【中文标题】在我的应用程序中使用自定义 UICollectionViewCell 时如何停止内存警告【英文标题】:How to stop memory warning when using custom UICollectionViewCell in my app 【发布时间】:2014-04-05 09:10:29 【问题描述】:

我做错了什么?我已经使用 parse.com 仪表板上传了一些 jpeg 图像,并设置了一些其他数据,例如标题和价格。在我的设备上滚动浏览我的 collectionView 时,它断断续续,然后最终崩溃。

代码如下:

- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView

    return 1;



-(NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section

    return [[self objects] count];


-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath object:(PFObject *)object

    NSArray *people = [self objects];
    static NSString *CellIdentifier = @"Cell";

    VAGGarmentCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier: CellIdentifier forIndexPath:indexPath];


    PFObject *current;

    current = [people objectAtIndex:indexPath.item];

    PFFile *userImageFile = current[@"image"];

    [userImageFile getDataInBackgroundWithBlock:^(NSData *imageData, NSError *error) 
        UIImage *image = [UIImage imageWithData:imageData];

        [[cell contentView] setContentMode: UIViewContentModeScaleAspectFit];
        [[cell imageView] setImage:image];

    ];

    [[cell title] setText:[current valueForKey:@"title"]];
    [[cell price] setText:[NSString stringWithFormat: @"£%@", [current valueForKey:@"price"]]];

    return cell;


我有一种强烈的感觉,这与我的图像有关。我希望有人能帮我解决这个问题。这是我第一次处理collection view。

感谢您的宝贵时间。 亲切的问候。

【问题讨论】:

你能 NSlog 你的图像大小并检查实际图像在集合视图中的大小 崩溃有什么异常?它可能与下载图像的方法有关。您可以考虑改用 SDWebImage 之类的东西。 @andreamazz 我收到“因内存压力而终止”消息。 @JSA986 图像大小为 2480.00 x 3508.00 (使用 NSLog(@"%.2f",image.size.width); NSLog(@"%.2f",image.size.height); ) 【参考方案1】:

您的图像大小是导致收藏视图中的内存问题和不连贯滚动的原因。调整图像大小,将调整大小的图像添加到您的收藏视图

//resize image
CGSize destinationSize = CGSizeMake(264,476);
UIGraphicsBeginImageContext(destinationSize);
[image drawInRect:CGRectMake(0,0,destinationSize.width, destinationSize.height)];

//New image
UIImage*newImage = UIGraphicsGetImageFromCurrentImageContext();
                    UIGraphicsEndImageContext();

//Optimise image
NSData *imageDataCompressed = UIImageJPEGRepresentation(newImage, 0.4f);
                    NSLog(@"Image Size %@", NSStringFromCGSize(newImage.size));//log size of image

【讨论】:

崩溃已停止,但滚动时仍然非常不稳定。可以看到用不同图像替换图像的单元格。 我又看了一遍,删除了图像和标签等。仍然有切碎。我删除了 getDataInBackgroundWithBlock 块,砍伐消失了。这显然与在后台加载的图像有关。我的 UITable 代码几乎与此相同,并且工作正常。不知道这里有什么不同。

以上是关于在我的应用程序中使用自定义 UICollectionViewCell 时如何停止内存警告的主要内容,如果未能解决你的问题,请参考以下文章

如何将子视图添加到自定义 UICollectionViewCell

如何在我的自定义应用程序中禁用 flashplayer 上的声音?

如何在 iOS 应用程序中使用自定义字体? [复制]

如何在我的自定义主题中包含自定义 js 文件?

是否可以在我的自定义技能中使用 Alexa Voice Profile

分支 IO - 在自定义事件中显示推荐参数