我的应用程序的一个视图显示了图像列表。当我多次滚动该列表时,我的应用程序崩溃了。我用仪器对其进行了分析,似乎列表的单元格在列表滚动时占用了更多内存。
从 tableView:cellForRowAtIndexPath: 返回时,自定义 UITableCell 是否应该“自动发布”?(如果我这样做了,我在 iOS 4.3 上会崩溃/在 iOS 5.0 和 6.1 上没问题)
这个自定义 UITableCell 有几张图片被绘制到它的“contentView”中。这些图片实际上是我在其中设置背景图像的自定义 UIButton。
自定义 UIButton 的代码:
@implementation ProductTileButtonIpad
@synthesize product;
- (id)initWithFrame:(CGRect)frame andProduct:(Product *)aProduct {
if (self = [super initWithFrame:frame]) {
self.product = aProduct;
self.productTileView = [[[HJManagedImageV alloc] initWithFrame:self.frame] autorelease];
self.productTileView.callbackOnSetImage = self;
self.productTileView.url = some picture url
[[ImageManager instance] manage:self.productTileView];
}
return self;
}
#pragma mark -
#pragma mark HJManagedImageV delegate
-(void) managedImageSet:(HJManagedImageV*)mi {
[self setBackgroundImage:mi.image forState:UIControlStateNormal];
}
-(void) managedImageCancelled:(HJManagedImageV*)mi {
}
- (void)dealloc {
NSLog(@"deallocating ProductTileButtonIpad");
[self.product release];
[self.productTileView release];
[super dealloc];
}
@end
自定义单元格的代码
@implementation ProductGridCellIpad
@synthesize products, parentController;
- (void)initializeWithProducts:(NSMutableArray *)productsToShow{
self.products = productsToShow;
// clear possible old subviews
for (UIView *v in self.contentView.subviews) {
[v removeFromSuperview];
}
NSInteger width = 240;
NSInteger height = 240;
Product *product0 = [products objectAtIndex:0];
self.productTile0 = [[[ProductTileButtonIpad alloc] initWithFrame:CGRectMake(12, 12, width, height) andProduct:product0] autorelease];
[self.productTile0 addTarget:self.parentController action:@selector(selectedProduct:) forControlEvents:UIControlEventTouchUpInside];
[self.contentView addSubview:self.productTile0];
[self.productTile0 release];
if ([self.products count] > 1) {
Product *product1 = [products objectAtIndex:1];
self.productTile1 = [[[ProductTileButtonIpad alloc] initWithFrame:CGRectMake(12 + width + 12, 12, width, height) andProduct:product1] autorelease];
[self.productTile1 addTarget:self.parentController action:@selector(selectedProduct:) forControlEvents:UIControlEventTouchUpInside];
[self.contentView addSubview:self.productTile1];
[self.productTile1 release];
}
if ([self.products count] > 2) {
Product *product2 = [products objectAtIndex:2];
self.productTile2 = [[[ProductTileButtonIpad alloc] initWithFrame:CGRectMake(2*(12 + width) + 12, 12, width, height) andProduct:product2] autorelease];
[self.productTile2 addTarget:self.parentController action:@selector(selectedProduct:) forControlEvents:UIControlEventTouchUpInside];
[self.contentView addSubview:self.productTile2];
[self.productTile2 release];
}
}
- (void)dealloc {
NSLog(@"deallocating ProductGridCellIpad");
if(self.products)
[self.products release];
if(self.productTile0)
[self.productTile0 release];
if(self.productTile1)
[self.productTile1 release];
if(self.productTile2)
[self.productTile2 release];
[super dealloc];
}
@end
这是创建单元格的代码:
NSString *productGridCellIpadIdentifier = @"ProductGridCellIpadIdentifier";
ProductGridCellIpad *cell = [tableView dequeueReusableCellWithIdentifier:productGridCellIpadIdentifier];
if(cell == nil) {
cell = [[ProductGridCellIpad alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:productGridCellIpadIdentifier];
[cell setFrame:CGRectMake(0, 0, self.view.frame.size.width, 244)];
}
[cell setParentController:self];
[cell initializeWithProducts:products];
return cell;
就像现在一样,代码在 iOS 4.3 上立即崩溃。它适用于 iOS 5 和 6,但应用程序在使用/滚动表格一段时间后仍然崩溃。
我不使用ARC。
我在 dealloc 方法中添加了一些 NSLog 以查看发生了什么,我可以看到很多“deallocating ProductTileButtonIpad”,但我从来没有看到“deallocating ProductGridCellIpad”
我的应用程序很容易达到 400Mb 的内存使用量。
我在这里做错了什么?
如果你们中的一些人有任何想法,可以帮助我理解的想法,将不胜感激:)