构建并运行
重用UITableViewCell对象
iOS设备内存是有限的,如果某个 UITableView 对象要显示大量的记录,并且要针对每条记录创建相应的 UITableViewCell 对象,就会很快耗尽iOS设备内存。
在 UITableView 上存在大量可优化的地方,其中最重要的就是关于 UITableViewCell 复用问题。因为当我们滑动界面是,大多数的 cell表格都会移出窗口,移出窗口的 UITableViewCell 对象放入 UITableViewCell 对象池,等待重用。当 UITableView 对象要求数据源返回某个 UITableViewCell 对象时,就可以先查看对象池。如果有未使用的 UITableViewCell 对象,就可以用新的数据配置这个 UITableViewCell 对象,然后将其返回给 UITableView 对象,从而避免了创建新的对象,可以极大的优化内存。
但是这里还会有一个问题:如果我们在 UITableView 对象中创建了不同的 UITableViewCell 表格,用来展示不同的信息。那么这时候 UITableViewCell 对象池中的对象就会存在不同的类型,那么 UItableView 就有可能会得到错误的类型的 UITableViewCell 对象。鉴于上述原因,必须保证 UITableView 对象能够得到正确的指定类型的 UITableViewCell 对象,这样才能确定返回的对象会拥有哪些属性和方法。
从 UITableViewCell 对象池获取对象时,无需关心取回的是否是某个特性的对象,因为无论取回来的是哪个对象,都要重新设置数据。真正要关心的是取回来的对象是否是某个特性的类型。每个 UITableViewCell 对象都有一个类型为 NSString 的 reuseIdentifier 属性。当数据源向 UITableView 对象获取可重用的 UITableViewCell 对象时,可传入一个字符串并要求 UITableView 对象返回相应的 UITableViewCell 对象。
#import "JXItemsViewController.h"
#import "JXItem.h"
#import "JXItemStore.h"
@interface JXItemsViewController ()
@end
@implementation JXItemsViewController
- (instancetype)init {
// 调用父类的指定初始化方法
self = [super initWithStyle:UITableViewStylePlain];
if (self) {
for (NSInteger i=0; i<15; i++) {
[[JXItemStore sharedStore] createItem];
}
}
return self;
}
- (instancetype)initWithStyle:(UITableViewStyle)style {
return [self init];
}
- (void)viewDidLoad {
[super viewDidLoad];
// 向控制器注册
[self.tableView registerClass:[UITableViewCell class]
forCellReuseIdentifier:@"UITableViewCell"];
}
#pragma mark - Table view data source
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return [[[JXItemStore sharedStore] allItem] count];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
// 创建 UITableViewCell 对象,风格使用默认风格
UITableViewCell * cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
reuseIdentifier:@"UITableViewCell"];
UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:@"UITableViewCell"
forIndexPath:indexPath];
// 获取 allItem 的第 n 个 JXItem 对象
// 然后将该 JXItem 对象的描述信息赋值给 UITableViewCell 对象的 textLabel
// 这里的 n 是该 UITableViewCell 对象所对应的表格索引
NSArray * items = [[JXItemStore sharedStore] allItem];
JXItem * item = items[indexPath.row];
cell.textLabel.text = [item description];
return cell;
}
@end










