最近項目上出了個bug从铲,在ios7以上正常運行膘侮,到ios7上卻crash帆离,最后查到原因渗蟹,自動布局的table類中使用了
_tableView.rowHeight = UITableViewAutomaticDimension;
這個方法,以便讓cell高度自動計算的拌滋,但問題也恰恰出現(xiàn)在這兒朴沿,因為如果想使用這個效果的話,那么
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
這個方法是不需要手動實現(xiàn)的,但在ios7上此方法必須實現(xiàn),否則會因為這個方法找不到而導致crash
一開始想通過宏定義的#ifdefine? 版本號 的方法來規(guī)避這個問題,但現(xiàn)實是#ifdefine 后的版本定義赌渣,在打包編譯時就生成一個特定的二進制了,也就是說打包版本是什么確定死了,不會根據(jù)裝在不同的手機上而體現(xiàn)不同魏铅,所以此方案被pass掉了,后來想通過#if 的方法去實現(xiàn)坚芜,但因為#if后面不能是變量沦零,同樣也被pass掉了
后來選擇了class_addMethod這個方法,一開始查了下runtime的api货岭,發(fā)現(xiàn)api是沒帶參數(shù)的路操,但是cell高度計算需要有tableview和index path這兩個參數(shù),然后只能試試了
class_addMethod([self class], @selector(resolveThisMethodDynamically), (IMP) myMethodIMP, "v@:");
很幸運千贯,如愿以償屯仗,
解釋一下這幾個參數(shù)
1, type(方法類型)用到時直接去官方文檔中有詳細的介紹
2, C函數(shù)中兩個隱式參數(shù)的意思 :
1, self:方法調用者
_cmd:當前調用方法編號
其中types參數(shù)為"f@:@:@“,按順序分別表示:
f:返回值類型loat搔谴,若是v則表示void魁袜,i則是int
@:參數(shù)id(self)
::SEL(_cmd)
后面的@:定義的tablerowH中的參數(shù) table 和indexpath