最近編寫新功能的時候,偶然間發現有較少開發經驗的開發人員對於表視圖的單元格的複用問題並非瞭解的很透徹,因此在此經過代碼的形式快速的教給你們如何理解和運用單元格的複用問題。表視圖是在開發中常常使用的控件,並且有時處理的內容量也是很是巨大的,這就須要考慮表視圖的性能優化,而最基本的性能優化則是單元格的複用,正所謂基礎打得好,才能飛得高,因此須要很好的理解單元格是如何複用的。xcode
在表視圖顯示的時候,會建立 (視圖中可看的單元格個數+1)個單元格,一旦單元格由於滑動的而消失在咱們的視野中的時候,消失的單元格就會進入緩存池(或叫複用池),當有新的單元格須要顯示的時候,會先從緩存池中取可用的單元格,獲取成功則使用獲取到的單元格,獲取失敗則從新建立心的單元格,這就是整個的複用機制。可是如何進行復用,這裏有兩種方式:緩存
第一種方式:性能優化
本身手動建立新的單元格ide
- #import "ViewController.h"
-
- #define width [UIScreen mainScreen].bounds.size.width
- #define height [UIScreen mainScreen].bounds.size.height
-
- static NSString *identifying = @"標識";
-
- @interface ViewController ()<UITableViewDelegate, UITableViewDataSource>
-
- @property (nonatomic, strong) UITableView *tableView;
-
- @end
-
- @implementation ViewController
-
- - (void)viewDidLoad {
- [super viewDidLoad];
-
-
-
- _tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, width, height) style:UITableViewStylePlain];
-
- _tableView.delegate = self;
- _tableView.dataSource = self;
- [self.view addSubview:_tableView];
- }
-
- #pragma mark - UITableViewDelegate 代理方法
- - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
-
- return 100;
- }
-
- #pragma mark - UITableViewDataSource 數據源
- - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
-
- return 20;
- }
-
- - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
-
-
- UITableViewCell *cell = [_tableView dequeueReusableCellWithIdentifier:identifying];
-
-
- if (cell == nil){
-
- cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifying];
- }
-
- cell.textLabel.text = [NSString stringWithFormat:@"第%ld行",indexPath.row];
-
-
- NSLog(@"address --- %p ----- 第%ld行",cell, indexPath.row);
-
- return cell;
- }
-
- @end
經過打印的地址咱們能夠看出複用:
第二種方式:post
經過註冊單元格類的方式,由表視圖本身建立單元格性能
- #import "ViewController.h"
-
- #define width [UIScreen mainScreen].bounds.size.width
- #define height [UIScreen mainScreen].bounds.size.height
-
- static NSString *identifying = @"標識";
-
- @interface ViewController ()<UITableViewDelegate, UITableViewDataSource>
-
- @property (nonatomic, strong) UITableView *tableView;
-
- @end
-
- @implementation ViewController
-
- - (void)viewDidLoad {
- [super viewDidLoad];
-
-
-
- _tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, width, height) style:UITableViewStylePlain];
-
- _tableView.delegate = self;
- _tableView.dataSource = self;
- [self.view addSubview:_tableView];
-
-
- [_tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:identifying];
- }
-
- #pragma mark - UITableViewDelegate 代理方法
- - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
-
- return 100;
- }
-
- #pragma mark - UITableViewDataSource 數據源
- - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
-
- return 20;
- }
-
- - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
-
-
- UITableViewCell *cell = [_tableView dequeueReusableCellWithIdentifier:identifying];
-
-
-
-
- cell.textLabel.text = [NSString stringWithFormat:@"第%ld行",indexPath.row];
-
-
- NSLog(@"address --- %p ----- 第%ld行",cell, indexPath.row);
-
- return cell;
- }
-
- @end
經過打印的地址咱們能夠看出複用:
兩種單元格的複用的方式存在着細微的差異,新手通常狀況下會不太理解,可是隻要仔細觀看以上的代碼,或者將代碼直接粘貼到新建立的工程中去,而後運行,能夠得出和我截圖出的同樣的結果。但願以上代碼可以幫助對於表視圖的單元格複用不太理解的開發人羣。固然這裏只是簡單的講解了一下單元格的重用機制,在實際的開發過程當中,可能會由於不一樣的展現效果,須要合理的利用單元格的複用。學習