【问题标题】:iOS UICollectionView memory leakiOS UICollectionView 内存泄漏
【发布时间】:2014-06-09 10:27:10
【问题描述】:

我通过情节提要创建了 UICollectionView。 我的单元格是自定义单元格类,有 3 个带图像的按钮。 我的图像可作为 GalleryItemInfo 类的一部分。我有这些对象的数组

[GalleryDataProvider sharedInstance].itemInfo

有 cellForItemAtIndexPath 的代码(在一个单元格中,数组中的三个项目有三个按钮):

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

    if (indexPath.row % 2 == 0 && !is_iPhone) {
        cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"cellOrangeRed" forIndexPath:indexPath];
        if (is_Fingerprint_Version) {
            cell.imageViewRope.image = [UIImage imageNamed:@"image-rope-1.png"];
        }
    } else {
        cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"cellGreenBlue" forIndexPath:indexPath];
        if (is_Fingerprint_Version) {
            cell.imageViewRope.image = [UIImage imageNamed:@"image-rope-2.png"];
        }
    }

    cell.previewCellDelegate = self;
    cell.tag = indexPath.row;
    NSInteger leftPreviedId = [cell firstPreviewId];
    self.leftPreviewedID = leftPreviedId;

    UIImage *image1 = ((GalleryItemInfo *)[[GalleryDataProvider sharedInstance].itemInfo objectAtIndex:leftPreviedId]).slotPreviewImage;
    UIImage *image2;
    UIImage *image3;

    if (leftPreviedId + 1 < [[GalleryDataProvider sharedInstance].itemInfo count])
        image2 = ((GalleryItemInfo *)[[GalleryDataProvider sharedInstance].itemInfo objectAtIndex:leftPreviedId + 1]).slotPreviewImage;

    if (leftPreviedId + 2 < [[GalleryDataProvider sharedInstance].itemInfo count])
        image3 = ((GalleryItemInfo *)[[GalleryDataProvider sharedInstance].itemInfo objectAtIndex:leftPreviedId + 2]).slotPreviewImage;

    [cell setupWithImage1:image1 image2:image2 image3:image3];

    if (self.isEditModeEnabled) {
        [cell showRemoveButtons];
    } else {
        [cell hideRemoveButtons];
    }

    return cell;
}

问题:当我滚动我的收藏时,每次从右向左滑动都会增加大约 1 兆字节的内存使用量。

为什么内存没有释放?

更新:

CollectionViewCellPreviewTriple 代码(通过情节提要创建):

#import <UIKit/UIKit.h>

@protocol UICollectionViewPreviewCellDelegate;


@interface CollectionViewCellPreviewTriple : UICollectionViewCell

@property (weak, nonatomic) IBOutlet UIButton *buttonSlot1;
@property (weak, nonatomic) IBOutlet UIButton *buttonSlot2;
@property (weak, nonatomic) IBOutlet UIButton *buttonSlot3;
@property (weak, nonatomic) IBOutlet UIButton *buttonRemove1;
@property (weak, nonatomic) IBOutlet UIButton *buttonRemove2;
@property (weak, nonatomic) IBOutlet UIButton *buttonRemove3;
@property (weak, nonatomic) IBOutlet UIImageView *imageViewRope;


@property (nonatomic, weak) id<UICollectionViewPreviewCellDelegate> previewCellDelegate;

- (void)setupWithImage1:(UIImage *)image1 image2:(UIImage *)image2 image3:(UIImage *)image3;
- (void)showRemoveButtons;
- (void)hideRemoveButtons;

- (NSInteger)firstPreviewId;

@end


@protocol UICollectionViewPreviewCellDelegate

- (void)collectionViewPreviewCell:(CollectionViewCellPreviewTriple *)collectionViewCell didSelectSubitemWithIndex:(NSInteger)subitemIndex;
- (void)collectionViewPreviewCell:(CollectionViewCellPreviewTriple *)collectionViewCell didEditModeRequestWithStatus:(BOOL)status;
- (void)collectionViewPreviewCell:(CollectionViewCellPreviewTriple *)collectionViewCell didRemoveRequestWithIndex:(NSInteger)subitemIndex;
- (void)slotButtonRequestsShadow:(UIButton *)slotButton;

@end

更新:

- (void)setupWithImage1:(UIImage *)image1 image2:(UIImage *)image2 image3:(UIImage *)image3
{
    [self.buttonSlot1 setBackgroundImage:image1 forState:UIControlStateNormal];
    [self.buttonSlot1 setBackgroundImage:image1 forState:UIControlStateHighlighted];

    //if (image2) {
    [self.buttonSlot2 setBackgroundImage:image2 forState:UIControlStateNormal];
    [self.buttonSlot2 setBackgroundImage:image2 forState:UIControlStateHighlighted];
    [self.buttonSlot2 setHidden:(image2 == nil)];
    //}
    //if (image3) {
    [self.buttonSlot3 setBackgroundImage:image3 forState:UIControlStateNormal];
    [self.buttonSlot3 setBackgroundImage:image3 forState:UIControlStateHighlighted];
    [self.buttonSlot3 setHidden:(image3 == nil)];
    //}
}

分析 link for screen

【问题讨论】:

  • 添加您的手机号码 (CollectionViewCellPreviewTriple.
  • 您使用过仪器和泄漏工具吗?根据您的描述,我怀疑是泄漏。
  • @ŁukaszTomaszewski ,好的,我加了。
  • @SirJam 告诉我这个方法的实现 - (void)setupWithImage1:(UIImage *)image1 image2:(UIImage *)image2 image3:(UIImage *)image3;
  • @ŁukaszTomaszewski ,代码已添加。

标签: ios objective-c memory-leaks


【解决方案1】:

这可能与许多人一直在为细胞没有被重复使用的地方所苦恼的问题有关。

要对此进行测试,您应该重写 prepareForReuse 方法并在其中编写一个非常简单的日志:

NSLog(@"%@ is being called as expected.", NSStringFromSelector(_cmd));

然后您应该运行您的应用程序,滚动集合视图并检查控制台以查看是否出现此日志。

如果此日志未出现,您可能需要check this answer 以获取有关如何继续的帮助。在我的应用程序中,单元格没有在模拟器中重用,而是在设备上重用。很奇怪。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-18
    • 1970-01-01
    • 1970-01-01
    • 2016-10-16
    相关资源
    最近更新 更多