SO,
我有一个包含20个单元格的tableview,每个单元格都有一个文本标题,一个字幕标签和一个文本字段(带有一个按钮,可以给它一个很好的背景),但是我发现在滚动tableview几次后它开始变慢在模拟器中。 我认为这是一个内存泄漏,但我想我已经释放了我需要的一切。对我(业余)代码的任何评论?
注意:我之前曾尝试使用Quartz中的圆角部分在文本视图周围绘制框,但这也会导致框滚动显着减慢。在破坏我的代码之前,请查看内存泄漏; P
注意2:PS对不起代码的自由,我找不到泄漏。
此致
// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease];
CGRect frame; frame.origin.x = 5; frame.origin.y = 10; frame.size.width = 20; frame.size.height = 25;
//Disallow Selection (Blue Flash)
cell.selectionStyle = UITableViewCellSelectionStyleNone;
//Print Icon
UIImageView *imgLabel = [[UIImageView alloc] initWithFrame:frame];
imgLabel.tag = 1;
[cell.contentView addSubview:imgLabel];
[imgLabel release];
//Print Text
frame.origin.x = 30;
frame.origin.y = 5;
frame.size.width = CONST_Cell_width;
UILabel *nameLabel = [[UILabel alloc] initWithFrame:frame];
nameLabel.tag = 100;
[cell.contentView addSubview:nameLabel];
[nameLabel release];
//subtitleLabel Text
UILabel *subtitleLabel = [[UILabel alloc] initWithFrame:CGRectMake(30, 32, CONST_Cell_width, 40)];
subtitleLabel.tag = 101;
[cell.contentView addSubview:subtitleLabel];
[subtitleLabel release];
// detailLabel.layer.cornerRadius = 10;
}
//This bit is good!
//cell.textLabel.text = [[contentArray objectAtIndex:indexPath.row] objectForKey:@"Title"];
//cell.detailTextLabel.text = [[contentArray objectAtIndex:indexPath.row] objectForKey:@"Description"];
//Sets wrapping correctly
//cell.textLabel.numberOfLines = 0;
//cell.detailTextLabel.numberOfLines = 0;
//Setup Name to Cell
UILabel * nameLabel = (UILabel *) [cell.contentView viewWithTag:100];
[nameLabel setFont:[UIFont boldSystemFontOfSize:20.0]];
nameLabel.text = [[contentArray objectAtIndex:indexPath.row] objectForKey:@"Title"];
nameLabel.textColor = [UIColor blackColor];
nameLabel.backgroundColor = [UIColor clearColor];
nameLabel.numberOfLines = 1;
//Setup Subtitle
UILabel * subtitleLabel = (UILabel *) [cell.contentView viewWithTag:101];
[subtitleLabel setFont:[UIFont systemFontOfSize:15.0]];
subtitleLabel.textColor = [UIColor grayColor];
subtitleLabel.text = [[contentArray objectAtIndex:indexPath.row] objectForKey:@"Description"];
subtitleLabel.backgroundColor = [UIColor clearColor];
subtitleLabel.numberOfLines = 2;
//A Nice Button for rounded background effect..cheap i know
UIButton *roundedButtonType = [[UIButton buttonWithType:UIButtonTypeRoundedRect] retain];
roundedButtonType.frame = CGRectMake(30, 80, CONST_Cell_width, CONST_Text_height);
roundedButtonType.userInteractionEnabled = NO;
roundedButtonType.backgroundColor = [UIColor clearColor];
[cell.contentView addSubview:roundedButtonType];
[roundedButtonType release];
UITextView *detailLabel = [[UITextView alloc] initWithFrame:CGRectMake(30, 80, CONST_Cell_width, CONST_Text_height)];
detailLabel.tag = indexPath.row;
detailLabel.backgroundColor = [UIColor clearColor];
detailLabel.text = [NSString stringWithFormat:@"%d",indexPath.row];
detailLabel.font = [UIFont fontWithName:@"Helvetica" size:17];
detailLabel.delegate = self;
[cell.contentView addSubview:detailLabel];
[detailLabel release];
//NSLog(@"Made my way to cellForRowAtIndexPath. Enter some data!!!\n");
//DataPoint Name
NSString *keyname = [NSString stringWithFormat:@"data%d",indexPath.row +1];
NSString *datavalue = [clientDataArray objectForKey:keyname];
//DataValue (can be null)
//NSString *dataValue = [clientDataArray objectForKey:keyname] ;
if (datavalue == [NSNull null] ) datavalue = @"(blank)";
detailLabel.text = datavalue;
return cell;
[datavalue release];
[keyname release];
[clientDataArray release];
}
答案 0 :(得分:1)
每次用户触摸tableView时,if(cell == nil)循环外的所有代码都会针对每个可见单元格运行。尝试放一个NSLog(@“我跑!”);就在return cell;
(返回后的代码不会被运行,即你的所有内存释放都没有完成)
好的,您通过给定视图标记做了正确的事情,以便稍后可以引用它们。
在return cell
使用标记设置标签值之前,在if(cell == nil)循环中执行所有UILabel内容,然后在循环外部执行:
((UILabel *)[cell viewWithTag:14]).text = [myDataArray objectAtIndex:indexPath.row];
喜欢这个。
if(cell == nil)块中的代码仅在之前未显示单元格时运行,即一直在屏幕外显示等。其余代码在使用时始终运行tableView。
希望有道理:)
答案 1 :(得分:0)
尝试使用性能工具'Leaks'
运行在Xcode中,点击“运行”>使用Performance Tool运行>泄漏
任何泄漏都显示为红线,您可以选择检测到泄漏的时间线上的部分,并通过检查堆栈找到泄漏。如果这一切听起来有点复杂,那么只需单步执行代码并确保使用alloc,new,copy或其变体发布您创建的任何内容,就应该捕获最多的潜在泄漏。
顺便说一句,一个简单的泄漏不会快速杀死你的应用程序,除非它进入一个巨大的循环或什么