iOS-my heightForRowAtIndexPath实现会导致性能问题,为什么?

iOS-my heightForRowAtIndexPath实现会导致性能问题,为什么?,ios,objective-c,performance,uitableview,Ios,Objective C,Performance,Uitableview,我使用一个表视图,其中我覆盖了heightforrowatinexpath。当我运行Xcode探查器时,我发现以下内容: 我想根据一个对象的属性计算高度。我对两种对象使用相同的表视图,User和Post。我的实现目前如下所示: - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { NSString *text; Post *cellPost

我使用一个表视图,其中我覆盖了
heightforrowatinexpath
。当我运行Xcode探查器时,我发现以下内容:

我想根据一个对象的属性计算高度。我对两种对象使用相同的表视图,
User
Post
。我的实现目前如下所示:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSString *text;
    Post *cellPost;
    User *cellUser;
    if (_pageType == FOLLOWERS || _pageType == FOLLOWING) {
        cellUser = [self.users objectAtIndex:indexPath.row];
        text = cellUser.userDescription.text;
        if (text == nil) {
            return 70;
        }
    } else {
        cellPost = [self.fetchedResultsController objectAtIndexPath:indexPath];
        text = cellPost.text;
    }

    CGSize boundingSize = CGSizeMake(245, CGFLOAT_MAX);
    CGSize requiredSize = [text sizeWithFont:[UIFont fontWithName:@"TisaMobiPro" size:15]
                               constrainedToSize:boundingSize
                                   lineBreakMode:NSLineBreakByWordWrapping];
    CGFloat textHeight = requiredSize.height;
    CGFloat cellHeight = textHeight + 40;
    if ([cellPost.text isEqualToString:self.post.text]) {
        cellHeight += 44;
        if (cellHeight < 114) {
            cellHeight = 114;
        }
    } else {
        if (cellHeight < 70) {
            cellHeight = 70;
        }
    }

    if (cellPost.repostedBy != nil && cellPost.youReposted.boolValue == NO && _pageType != CONVERSATION) {
        cellHeight += 27;
    }

    return cellHeight;

}
-(CGFloat)tableView:(UITableView*)tableView rowatinexpath的高度:(nsindepath*)indepath
{
NSString*文本;
邮政署*cellPost;
用户*cellUser;
如果(_pageType==跟随者| |_pageType==跟随者){
cellUser=[self.users objectAtIndex:indexath.row];
text=cellUser.userDescription.text;
如果(文本==nil){
返回70;
}
}否则{
cellPost=[self.fetchedResultsController对象索引路径:indexPath];
text=cellPost.text;
}
CGSize boundingSize=CGSizeMake(245,CGFLOAT_MAX);
CGSize requiredSize=[text sizeWithFont:[UIFont fontWithName:@“TisaMobiPro”大小:15]
constrainedToSize:boundingSize
lineBreakMode:NSLineBreakByWordWrapping];
CGFloat textHeight=所需尺寸.height;
CGFloat单元高度=文本高度+40;
if([cellPost.text isEqualToString:self.post.text]){
单元高度+=44;
如果(单元高度<114){
单元高度=114;
}
}否则{
如果(单元高度<70){
单元高度=70;
}
}
if(cellPost.repostedBy!=nil&&cellPost.youReposted.boolValue==NO&&u页面类型!=CONVERSATION){
单元高度+=27;
}
返回高度;
}

如果我删除了大部分代码,并且只有,例如,
return 100
,那么tableView的滚动性能就会大大提高。您能否在我的植入过程中发现可能导致此性能问题的内容或提供建议?

如果您的目标是iOS7,您可以使用
NSTableView
属性:
EstimateDroweight

从苹果文档:

提供行高度的非负估计值可以提高 加载表视图的性能。如果表中包含变量 高度行时,计算它们的所有高度可能会很昂贵 桌子上满是东西。使用估算允许您推迟部分成本 从加载时间到滚动时间的几何计算

此外:

每次 显示表格视图时,它调用表格视图:heightForRowAtIndexPath: 在代理的每一行上

如果必须使用
tableView:heightforrow索引路径:
缓存@Waine建议的高度。


高度是在调用
–tableView:cellForRowAtIndexPath:
之前计算出来的,用于计算所有单元格数
如果要在iOS7上部署,可以使用
-tableView:estimatedheightforrowatinexpath:
,使用该方法可以在滚动tableView时推迟此计算。这意味着基本上在显示单元格时调用方法
tableView:heightforrowatinexpath:
。估计可能是一个接近TVC平均值的固定数字,或者基于比您实现的更快的数学运算。

由于该估计,电视可以将其内容大小设置为滚动条高度,而不需要在一次拍摄中计算100行的每个高度。由于电视正在计算实际的行高,滚动过程中的回报可能是一个延迟。

盲目猜测:
[text sizeWithFont:…]
必须进行大量计算。但我一点也不自信。使用探查器。你能确定前面字符串的高度并缓存它们吗?此方法会重复运行(如您所见),因此,如果大小不改变(或不经常改变),那么这是非常浪费的。@H2CO3,是的,当我“禁用”隐藏系统库时,字体大小似乎是这里的主要问题。韦恩,我会试试的。除非你知道一种更简单更有效的方法,而不是用字体大小。iOS6没有这个问题,只是现在iOS7出现了这个问题。您使用的是自定义字体吗?在ViewDidLoad中创建一次,将其存储在模块变量中,然后使用它,怎么样?好主意。不确定这会有多大的性能改进。计算文本的高度似乎是主要问题。还注意到,
sizeWithFont
已被弃用。我现在使用的是
文本边界矩形