xib建立cell卡頓、無法重用問題
轉:https://www.jianshu.com/p/5e0a3bb5714a
悠揚 2021.08.05 15:19:12字數 588閱讀 290在使用xib載入Cell時,遇到了卡頓的問題,寫法使用的是舊式方法,即判斷cell是否為空,如果為空則使用loadNibNamed方法載入一個
YKCallBaseCell *cell = [tableView dequeueReusableCellWithIdentifier:NSStringFromClass([YKCallBaseCell class])];
if (cell == nil) {
cell = [[NSBundle mainBundle] loadNibNamed:NSStringFromClass([YKCallBaseCell class]) owner:self options:nil][0];
}
寫法本身沒有問題,但實際執行時發現,如果cell數量較多,滑動較快時,會非常卡頓,通過Xcode可以觀察到快速滑動時佔用了大量CPU,感覺cell每次都是新創建出來的,好像根本沒有被重用,後來在查閱一些早期介紹UITableViewCell使用方法時,發現一篇文章中有這樣一段描述(來自:https://blog.csdn.net/yohunl/article/details/19619167/):
xib中設定cell的identifier嚴重注意:我們之前這麼用都沒注意過重用的問題,這樣寫,如果在xib頁面沒有設定 重用字串的話,是不能夠被重用的,也就是每次都會重新建立,這是嚴重浪費記憶體的,所以,需要修改啊,一種修改方式是使用如下ios5提供的新方式:
- ( void )registerNib:( UINib *)nib forCellReuseIdentifier:( NSString *)identifier
還有就是在xib頁面設定好(ios5之前也可以用的)
總結下來就是,使用xib載入cell有兩種寫法:
第一種是舊式寫法,使用dequeueReusableCellWithIdentifier方法重用cell,同時需要判斷cell是否為nil,如果為nil需要建立一個,最關鍵的是記得在xib中設定cell的identifier以複用cell
第二種是使用registerNib先註冊cell,然後使用dequeueReusableCellWithIdentifier: forIndexPath:方法進行重用,不用判斷cell是否為空,簡單方便
留下這篇文章也是因為測試兩種方法過程中,發現效能差距巨大,非常困惑,最後排查到原因就是沒有在xib中設定cell的identifier,很久沒用xib建立cell完全忘記了這個關鍵點,同時也突出了方法二的優點,建議在使用xib建立cell時使用方法二來註冊cell,共勉。