UITableView.05 性能优化:

【为何要性能优化】:TableView拖屏过程中,不断有对象"消失"在屏幕上,但是这样的对象还是存在的,当拖拉过多后,导致内存严重泄漏。

解决方法:仅提供有限的对象,拖拉过程中,只是将内存地址存放的内容进行改变。


 

 

【旧代码】

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil];
    cell.textLabel.text=[NSString stringWithFormat:@"itcast-%d",indexPath.row];
    NSLog(@"--%p--%d",cell,indexPath.row);
    return cell;
 }

 

【旧代码测试】:
  如图片所示,view中每显示一个新的row,都会创建一个新的内存地址,所以,拖的多了,就会产生许多个对象,这样会严重影响性能。

 


 

 

【新代码】

#pragma mark 每当有一个cell进入视野范围内就会调用,返回当前这行显示的cell
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    // 0.用static修饰的局部变量,只会初始化一次< # # > 
    static NSString *ID = @"Cell";
    
    // 1.拿到一个标识先去缓存池中查找对应的Cell
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];
    
    // 2.如果缓存池中没有,才需要传入一个标识创建新的Cell
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:ID];
    }
    
    // 3.覆盖数据
    cell.textLabel.text = [NSString stringWithFormat:@"fdsfdsf-%d", indexPath.row];
    
    return cell;
}

 

【新代码测试】:

  由测试图可以看出,新代码只产生12个对象,其余内容都使用原先的12个内存地址。

    运行步骤:1.第一次加载需要加载11行,首先查找[缓存池]中是否有这11行的对象,缓存池中没有。所以创建

         2.第二次,用户拖屏后,数据显示第12行,也是先去[缓存池]中寻找是否有这个对象,缓存池中没有,创建。

         3.第三次,用户拖屏后,数据显示到第12行,第一行的数据已经不显示再view上了,第一行就移动到[缓存池]。

           4.当用户拖屏,数据显示到第13行时候,缓存池中有对象,于是,就将这个对象移出,作为第13行内容,第2行移动到[缓存池]

         5.以此类推.
【如图】第0行和第12行的内存地址相同,很好的佐证了上面的理论依据。

posted on 2014-08-05 22:44  ZiCheng  阅读(214)  评论(0编辑  收藏  举报