好吧,我不知道你是否还需要这个问题的答案,但是……这到底是怎么回事。我们开工吧。我会做一些假设,但如果你遇到性能问题,真正解决这个问题的唯一方法是测试它,如果不了解你的视图的复杂性,我们就无法真正获得可靠的指标. 所以我会假设你已经尝试了一些东西,然后扔了一些你可能没有尝试过的东西。
当您从 nib 加载视图时,它会从文件中取消归档它。如果该加载发生 50 次,那可能会对您的性能问题大有帮助。那么我们还能做些什么呢?好吧,在您的表视图控制器类中,创建一个类型为 的新实例变量NSData
。然后,在您的-init
方法(或其他指定的初始化程序)中,从属性列表中加载视图:
- (id)init
{
self = [super init];
if (self) {
// Other initialization code.
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"MyView"
ofType:@"plist"];
myData = [[NSData alloc] initWithContentsOfFile:filePath];
}
return self;
}
好的,所以您已将此属性列表加载到NSData
. 现在,剩下的应该很清楚了:
- (UIView *)tableView:(UITableView *)tableView
viewForHeaderInSection:(NSInteger)section
{
UIView *view = [NSKeyedUnarchiver unarchiveObjectWithData:myData];
return view;
}
我的目标是始终将完全实例化的视图保留在内存中。但后来我想,“他将如何创建那个 plist?” 所以我稍微修改了一下。不要从文件中加载数据,而是在代码中创建视图:
- (UIView *)tableView:(UITableView *)tableView
viewForHeaderInSection:(NSInteger)section
{
UIView *headerView;
if (myData == nil) {
headerView = [[UIView alloc] init];
// Configure your view, but only that part that isn’t customized.
myData = [[NSKeyedArchiver archivedDataWithRootObject:headerView] copy];
} else {
headerView = [NSKeyedArchiver unarchiveObjectWithData:myData];
}
// Now customize the view for your particular section.
return headerView;
}
这应该为您提供在代码中创建视图的灵活性,但也希望将其保存在内存中并为您缓存。试试看!