技術分享-TableView性能優化—緩存區

----Make by -LJW 轉載請註明出處--- 緩存

  • 重用原理:當滾動列表時,部分UITableViewCell會移出窗口,UITableView會將窗口外的UITableViewCell放入一個對象池中,等待重用。當UITableView要求dataSource返回UITableViewCell時,dataSource會先查看這個對象池,若是池中有未使用的UITableViewCell,dataSource會用新的數據配置這個UITableViewCell,而後返回給UITableView,從新顯示到窗口中,從而避免建立新對象
  • 還有一個很是重要的問題:有時候須要自定義UITableViewCell(用一個子類繼承UITableViewCell),並且每一行用的不必定是同一種UITableViewCell,因此一個UITableView可能擁有不一樣類型的UITableViewCell,對象池中也會有不少不一樣類型的UITableViewCell,那麼UITableView在重用UITableViewCell時可能會獲得錯誤類型的UITableViewCell
  • 解決方案:UITableViewCell有個NSString *reuseIdentifier屬性,能夠在初始化UITableViewCell的時候傳入一個特定的字符串標識來設置reuseIdentifier(通常用UITableViewCell的類名)。當UITableView要求dataSource返回UITableViewCell時,先經過一個字符串標識到對象池中查找對應類型的UITableViewCell對象,若是有,就重用,若是沒有,就傳入這個字符串標識來初始化一個UITableViewCell對象

 

 1 #pragma make 數據源方法
 2 //一共有多少組數據
 3 - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
 4 {
 5     return 1;
 6 }
 7 //第section組有多少row(一組有多少行)
 8 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
 9 {
10     return self.heros.count;
11 }
12 
13 #pragma make TableView性能優化
14 //******************************************************************************
15 
16 // cellForRowAtIndexPath 顯示的內容(顯示的主要內容)
17 /**
18  *  每當有一個cell進入視野範圍內,就會調用
19  */
20 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
21 {
22     /*
23     //顯示名字和詳情的方法
24     //(用戶每次拖拽頁面都會從新建立新的TableView,多以會有性能問題)
25     //爲了解決這個問題,會把多出的一個TableView放到緩存區,用戶拖拽的時候用到在拿出來,避免建立多餘的,TableView循環使用
26     UITableViewCell *cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:nil];
27     */
28     // static修飾局部變量:能夠保     證局部變量只分配一次存儲空間(只初始化一次)
29     static NSString *ID = @"hero";
30     // 1.經過一個標識去緩存池中尋找可循環利用的cell
31     // dequeue : 出列 (查找)
32     UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];
33 
34     // 2.若是沒有可循環利用的cell
35     if (cell == nil){
36         cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:ID];
37 //        NSLog(@"------緩存池找不到cell--%d", indexPath.row);
38     }
39     // 3.給cell設置新的數據
40     //取出模型
41     JWhero *hero = self.heros[indexPath.row];
42     //設置名字
43     cell.textLabel.text = hero.name;
44     //添加第二列詳情
45     cell.detailTextLabel.text = hero.intro;
46     //設置頭像
47     cell.imageView.image = [UIImage imageNamed:hero.icon];
48 
49     //添加cell右邊指示器的樣式
50     cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
51     //添加cell右邊指示器按鈕
52 //    cell.accessoryView = [[UISwitch alloc]init];
53 
54     //設置cell默認背景圖片 或者 背景顏色(背景view不用設置尺寸,優先級backgroundView > backgroundColor),因此設置默認背景顏色最好用backgroundView
55 //    UIView *bgView = [[UIView alloc]init];
56     UIImageView *bgView = [[UIImageView alloc] init];
57     bgView.image = [UIImage imageNamed:@"buttongreen"];
58 //    bgView.backgroundColor = [UIColor redColor];
59     cell.backgroundView = bgView;
60 
61     //設置cell點擊狀態背景顏色
62     UIView *selectedbgView = [[UIView alloc]init];
63     selectedbgView.backgroundColor = [UIColor yellowColor];
64     cell.selectedBackgroundView = selectedbgView;
65 
66     return cell;
67 }
相關文章
相關標籤/搜索