更新到iOS 8后,我的应用程序在UITableView中滚动时出现严重的性能问题 - 它在iOS 7上完全没有。它似乎滞后或经常跳转一点。iOS 8桌面视图控制器性能问题
它会影响较旧的(第二代)和较新的(第四代视网膜)iPad,但不会影响iPhone,因为我的iPhone 5可以通过以完全相同方式构建的TableView滚动。
重要:它似乎只影响UITableViewControllers在形式片呈现模态 - 在默认UIViewController中手动创建别的地方不表意见。甚至没有一个具有自定义表视图的UIViewController表单(例如属性)受到影响。
仪器说CPU时间大约3%转到cellForRowAtIndex方法,这是最耗时的方法。这3%中,75%呈上行:
EventTableViewCell *cell = [tableView
dequeueReusableCellWithIdentifier:CellIdentifier
forIndexPath:indexPath];
cellForRowAtIndex看起来是这样的:
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"tablecell";
EventTableViewCell *cell = [tableView
dequeueReusableCellWithIdentifier:CellIdentifier
forIndexPath:indexPath];
NSDictionary *thismsg = [messages objectAtIndex:indexPath.row];
switch ([[thismsg objectForKey:@"type"] intValue]) {
case 1:
cell.eventTitleLabel.textColor = [UIColor greenColor];
break;
case 2:
cell.eventTitleLabel.textColor = [UIColor redColor];
break;
case 3:
cell.eventTitleLabel.textColor = [UIColor colorWithRed:0.0 green:128.0/255.0 blue:1.0 alpha:1];
break;
case 4:
cell.eventTitleLabel.textColor = [UIColor orangeColor];
break;
default:
cell.eventTitleLabel.textColor = [UIColor whiteColor];
break;
}
cell.eventTitleLabel.text = [thismsg objectForKey:@"m"];
cell.timestampLabel.text = [thismsg objectForKey:@"t"];
cell.authorNameLabel.text = [thismsg objectForKey:@"a"];
cell.backgroundColor = [UIColor blackColor]; // this needs to be here, but removing it makes no difference to performance.
return cell;
}
我的子类的细胞具有IB仅由几个标签,这是那些文字是分配给。
的视图控制器和表视图的故事板的设置是这样的:
EventTableViewCell.h:
属性链接到上述图像显示故事板的元件
@interface EventTableViewCell : UITableViewCell
@property (weak, nonatomic) IBOutlet UILabel *eventTitleLabel;
@property (weak, nonatomic) IBOutlet UILabel *timestampLabel;
@property (weak, nonatomic) IBOutlet UILabel *authorNameLabel;
@end
EventTableViewCell .m:
@implementation EventTableViewCell
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self) {
// Initialization code
}
return self;
}
- (void)awakeFromNib
{
// commenting out this method does nothing to performance, only makes it the wrong color
UIView *bgColorView = [[UIView alloc] init];
bgColorView.backgroundColor = [UIColor darkGrayColor];
[self setSelectedBackgroundView:bgColorView];
}
- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
[super setSelected:selected animated:animated];
// Configure the view for the selected state
}
@end
快速查看调试导航器在极端向上和向下滚动期间(您作为普通用户所做的任何事情都是如此)。正常的快速滚动会导致大约15%的CPU使用率。这些峰值在25%的标记 - 我假设,因为他们运行在同一线程和iPad有4可用。快速滚动的性能与慢速滚动的性能相同,因此CPU似乎并未参与其是否滞后。这个0%是在我停止滚动截取屏幕截图之后,表明该应用程序是而不是忙于在后台或其他视图控制器中执行其他任何操作。而且正如你所看到的,它也不会泄漏内存,因为无论持续滚动多长时间,它都会持续下降到23MB左右。
你有没有尝试分析应用程序? – Shai 2014-09-22 06:47:04
你能否粘贴你的表格视图的代码 – meim 2014-09-22 07:08:11
@nickdnk如果你想成为一名认真的iOS开发人员学习使用Instruments。过去几年中,我不得不优化许多表格视图代码。人们可以犯的错误太多了。仪器可以帮助你做到更多。 – dasdom 2014-09-22 09:47:18