【发布时间】: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)];
//}
}
【问题讨论】:
-
添加您的手机号码 (
CollectionViewCellPreviewTriple. -
您使用过仪器和泄漏工具吗?根据您的描述,我怀疑是泄漏。
-
@ŁukaszTomaszewski ,好的,我加了。
-
@SirJam 告诉我这个方法的实现 -
(void)setupWithImage1:(UIImage *)image1 image2:(UIImage *)image2 image3:(UIImage *)image3; -
@ŁukaszTomaszewski ,代码已添加。
标签: ios objective-c memory-leaks