내 앱의보기 중 하나에 이미지 목록이 표시됩니다. 그 목록을 여러 번 스크롤하면 내 앱이 다운됩니다. 필자는 악기로 그 프로파일을 만들었고 목록의 셀은 목록이 스크롤 될 때 더 많은 메모리를 사용하고있는 것처럼 보입니다.iOS : UITableView를 스크롤 할 때 앱 크래시/메모리가 채워짐
tableView : cellForRowAtIndexPath에서 반환 할 때 사용자 지정 UITableCell이 '자동 게시'되어야합니까? (내가 할 경우 iOS 4.3에서 충돌이 발생합니다.) iOS 5.0 및 6.1에서는 괜찮습니다.
이 맞춤식 UITableCell에는 'contentView'에 그려진 그림이 여러 개 있습니다. 그 그림들은 실제로 배경 이미지를 설정하는 커스텀 UIButton입니다.
이미지는 사용자있는 UIButton에 대한 HJManagedImageV
코드 관리 : 사용자 정의 셀 여기
@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
및 대한
@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
코드의 셀 생성 코드 :
을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를 사용하지 않습니다.
나는 무슨 일이 일어나고 있는지 확인하기 위해 할당 해제의 방법에 일부 NSLog를 추가하고 나는내 애플 쉽게 400MB의 메모리 사용량에 도달 "ProductGridCellIpad을 할당 해제", "ProductTileButtonIpad을 할당 해제"하지만 난 못 볼을 많이 볼 수 있습니다.
내가 뭘 잘못하고 있니? 여러분 중 몇몇은 어떤 생각이있는 경우
은, 내 이해를 도울 수있는 아이디어는 그것을 많이 주시면 감사하겠습니다 :)
그게 맞는지는 모르지만 ARC를 사용하지 않으면 셀을 자동으로 내 보내야합니다. –
문제는 초기화 할 때마다 초기화해야한다는 것입니다. 초기화는 한 번만해야합니다. tableview를 사용할 때처럼 (cell == nil) {// Do you initialization} // 여기서 값만 업데이트합니다. .. 여기 초기화가 없습니다 .. – iphonic
@iphonic "당신은 매번 초기화 작업을하고 있습니다"라는 말은 무엇을 의미합니까? 내가 셀 재활용을 사용하기 때문에 ... – Alexis