总结 ﹣ UITableView 中,说了如何遵守协议调用方法,使UITableView展示数据: 如下面代码所示
//这种调用方法,固然可以从数据模型中获取到数据,并且展示出来, //每当一个cell进入视野范围内,就会调用一次方法(打印一下就可以测试) - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:nil]; Apple *apple = self.apple[indexPath.row]; cell.textLabel.text =apple.name; cell.detailTextLabel.text = apple.intro; cell.imageView.image = [UIImage imageNamed:apple.icon]; return cell; }
不好的地方:(对性能的影响)
1 . 一开始就创建了可视范围的多个对象
2 . 每调用一次都分配 新的存储空间,去创建UITableViewCell对象 , 也就是说, 假如滚动很快,快速来回滚动的时候,内存会忽然飙升得很高.(因为不断[[UITableViewCell alloc] )
性能优化 :
性能优化的思路 :
假如屏幕只能显示 八块UITableViewCell , 引入一个 缓存池机制 ,当继续滚动到下一个的时候 , 这个时候创建 第九块 UITableViewCell , 然后 第一块UITableViewCell完全消失的时候,将它放入 缓存池 中,等到 第十块UITableViewCell需要再创建的时候,从 缓存池 中拿出 第一块UITableViewCell , 周而复始.
所以. 屏幕假如只显示8块Cell , 整个过程至销毁只要创建9块Cell对象即可.整个过程怎样滚动也不需要在多创建UITableViewCell
注意点:
当开发程序复杂的时候, 缓存池 里面有各种各样的东西,很多的cell等,所以怎样知道区分cell对应的UITableView呢?
解决办法: 每次创建UITableViewCell , 都给它绑定一种类型(一种标示等) , 然后从 缓存池 [color=blue][/color]中找的时候,根据类型(标示等)去找到对应的
cell用来重用
步骤:
1. 通过一个标识,去缓存池中寻找可循环利用的cell
2. 如果缓存池找不到, 可循环利用的cell: 创建一个新的cell , 给cell贴个标识
3. 给cell设置新的数据.
代码如下 :
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { //0. static修饰局部变量: 可以保证局部变量只分配以此存储空间(只初始化一次) static NSString *ID = @"Apple"; //1. 通过一个标识,去缓存池中寻找可循环利用的cell UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID]; //2. 如果缓存池找不到, 可循环利用的cell: 创建一个新的cell , 给cell贴个标识 if (cell == nil) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:ID]; } //3 经过前两步后肯定又Cell了.给cell设置新的数据. Apple *apple= self.apple[indexPath.row]; cell.textLabel.text =apple.name; cell.detailTextLabel.text = apple.intro; cell.imageView.image = [UIImage imageNamed:apple.icon]; NSLog(@"%p - %@ - %ld ",cell,apple.name,indexPath.row); return cell; }