1. 程式人生 > 其它 >xib建立cell卡頓、無法重用問題

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頁面沒有設定 重用字串的話,是不能夠被重用的,也就是每次都會重新建立,這是嚴重浪費記憶體的,所以,需要修改啊,一種修改方式是使用如下ios5提供的新方式:

- ( void )registerNib:( UINib  *)nib forCellReuseIdentifier:( NSString  *)identifier

還有就是在xib頁面設定好(ios5之前也可以用的)

  xib中設定cell的identifier

總結下來就是,使用xib載入cell有兩種寫法:

第一種是舊式寫法,使用dequeueReusableCellWithIdentifier方法重用cell,同時需要判斷cell是否為nil,如果為nil需要建立一個,最關鍵的是記得在xib中設定cell的identifier以複用cell

第二種是使用registerNib先註冊cell,然後使用dequeueReusableCellWithIdentifier: forIndexPath:方法進行重用,不用判斷cell是否為空,簡單方便

留下這篇文章也是因為測試兩種方法過程中,發現效能差距巨大,非常困惑,最後排查到原因就是沒有在xib中設定cell的identifier,很久沒用xib建立cell完全忘記了這個關鍵點,同時也突出了方法二的優點,建議在使用xib建立cell時使用方法二來註冊cell,共勉。