更新到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