(十七)TableView的本地性能优化

面试中常常会问TableView的性能优化。

TableView只会加载能看到的Cell,每当有一个Cell进入视野范围内,就会调用。

存在着内存隐患,如果用户拖动的很快,所以内存会飙升的很快,因此要针对cell的返回方法上进行性能优化。

优化方案:系统调用这个方法的时候就是为了得到cell,一般的方法就是每次都alloc一个cell,可以设计一个缓存池,当被创建过的cell逃出视野后,将这个cell丢入缓存池,当发现有新的cell要创建的时候,先去缓存池有没有数据,有数据就拿过来然后改数据,否则就alloc一个cell

一个细节:判断cell的类型是否和当前相符,每次创建cell的时候都给cell绑定一个标识,标识一样才能拿过来用。

性能优化的步骤:

1.通过标识去缓存池中找可循环利用的cell。

2.如果缓存池中找不到可循环利用的cell,创建一个新的cell,给cell贴一个标签。

3.给cell设置新的数据。

这个缓存池是系统自动维护的,位于TableView内部,扔到缓存池的操作是系统自动做的,只需要去缓存池拿就可以。

从缓存池中拿使用的是对象方法dequeue。

具体做法为:注意为了保证Identifier的一致性,因此最好用变量存储,为了防止变量连续创建,应该用static特性。

不用宏的原因:ID仅用于cell的创建函数中,这样可以保证别的地方无法访问,而宏主要用于公共调用。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    
    static NSString *ID = @"A";
    
    //先试着从缓存池拿特定标识A的cell
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];
    //判断有没有在缓存池内拿到数据,没有拿到标识为A的cell
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:ID];
    }
    //设置数据
    Hero *hero = self.heros[indexPath.row];
    cell.textLabel.text = hero.name;
    cell.detailTextLabel.text = hero.intro;
    cell.imageView.image = [UIImage imageNamed:hero.icon];
    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
    
    return cell;
    
}
用staitc修饰局部变量可以保证变量只分配一次存储空间,优化性能。

Tip:TableView还有关于网络的性能优化,在以后学到以后再进行介绍。

Tip:虽然离开屏幕的cell会自动销毁,也应该慎用alloc,内存频繁的创建和销毁是很消耗性能的。






posted on 2015-02-06 15:25  张大大123  阅读(152)  评论(0编辑  收藏  举报

导航