說(shuō)一下自己在寫(xiě)項(xiàng)目的時(shí)候遇到的一個(gè)坑,真的是比較坑呀!有時(shí)系統(tǒng)cell的line沒(méi)法滿(mǎn)足需求,一般我都會(huì)選擇寫(xiě)一個(gè)分類(lèi)修改一個(gè)cell的高度就會(huì)起到線的效果;結(jié)果這個(gè)分類(lèi)在進(jìn)行cell編輯的時(shí)候卻讓我掉坑里啦!這不我在左劃時(shí)就出了奇葩的bug!先梳理一下其他知識(shí):
分類(lèi)
Category的作用
- 可以在不修改原來(lái)類(lèi)的基礎(chǔ)上, 為這個(gè)類(lèi)擴(kuò)充一些方法
- 一個(gè)龐大的類(lèi)可以分模塊開(kāi)發(fā)
- 一個(gè)龐大的類(lèi)可以由多個(gè)人來(lái)編寫(xiě),更有利于團(tuán)隊(duì)合作
Category的使用注意:
- 分類(lèi)只能增加方法,不能增加成員變量
- 在分類(lèi)方法的實(shí)現(xiàn)中可以訪問(wèn)原來(lái)類(lèi)的成員變量
- 分類(lèi)中可以重新實(shí)現(xiàn)原來(lái)類(lèi)的方法,但是會(huì)覆蓋原來(lái)的方法
- 方法的調(diào)用優(yōu)先級(jí):分類(lèi)->原來(lái)的類(lèi)->父類(lèi)
類(lèi)的啟動(dòng)過(guò)程
+load方法
- 在程序啟動(dòng)的時(shí)候會(huì)加載所有的類(lèi)和分類(lèi),并調(diào)用所有類(lèi)和分類(lèi)的+load方法(只會(huì)調(diào)用一次)
- 先加載父類(lèi),再加載子類(lèi);也就是先調(diào)用父類(lèi)的+load,再調(diào)用子類(lèi)的+load
- 先加載元原始類(lèi),再加載分類(lèi)
- 不管程序運(yùn)行過(guò)程有沒(méi)有用到這個(gè)類(lèi),都會(huì)調(diào)用+load加載
+initialize
- 在第一次使用某個(gè)類(lèi)時(shí)(比如創(chuàng)建對(duì)象等),只會(huì)調(diào)用一次+initialize方法
- 一個(gè)類(lèi)只會(huì)調(diào)用一次+initialize方法,先調(diào)用父類(lèi)的,再調(diào)用子類(lèi)的
bug是這樣的 :

我的分類(lèi)這樣寫(xiě)的:
- (void)setFrame:(CGRect)frame{
frame.size.height -= 1;
[super setFrame:frame];
}
如果我把上面分類(lèi)的代碼注釋掉,bug 就消失啦!

我滑動(dòng)一下cell就要執(zhí)行一次setFrame:
所以會(huì)出現(xiàn)cell上移的問(wèn)題;cell的正常高度應(yīng)該是44-1;

我多劃幾次就這樣啦:
