2014-04-24 128 views
0

我已經通過故事板創建了UICollectionView。 我的單元格是自定義單元格類,它有3個帶圖像的按鈕。 我的圖像可作爲類GalleryItemInfo的一部分。我有那些對象的數組iOS UICollectionView內存泄漏

[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

+0

添加你的代碼('CollectionViewCellPreviewTriple'。 –

+0

有你使用的儀器和工具的泄漏?從你描述我相當懷疑是泄漏。 – Volker

+0

@ŁukaszTomaszewski,好吧,我加入了。 –

回答

0

這可能與許多人在細胞沒有被重複使用時所遭受的問題有關。

要進行測試,您應該覆蓋的方法prepareForReuse和它寫一個非常簡單的日誌:

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

您應該然後運行你的應用程序,滾動集合視圖,並檢查控制檯來看看這個日誌出現。

如果未出現此日誌,您可能需要check this answer以獲得有關如何繼續的幫助。在我的應用程序中,單元不在模擬器中重用,但在設備上重用。這很古怪。