Runtime 五之动态添加方法

最近项目上出了个bug,在ios7以上正常运行,到ios7上却crash,最后查到原因,自动布局的table类中使用了

_tableView.rowHeight = UITableViewAutomaticDimension;

这个方法,以便让cell高度自动计算的,但问题也恰恰出现在这儿,因为如果想使用这个效果的话,那么

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath

这个方法是不需要手动实现的,但在ios7上此方法必须实现,否则会因为这个方法找不到而导致crash

一开始想通过宏定义的#ifdefine  版本号 的方法来规避这个问题,但现实是#ifdefine 后的版本定义,在打包编译时就生成一个特定的二进制了,也就是说打包版本是什么确定死了,不会根据装在不同的手机上而体现不同,所以此方案被pass掉了,后来想通过#if 的方法去实现,但因为#if后面不能是变量,同样也被pass掉了

后来选择了class_addMethod这个方法,一开始查了下runtime的api,发现api是没带参数的,但是cell高度计算需要有tableview和index path这两个参数,然后只能试试了

class_addMethod([self class], @selector(resolveThisMethodDynamically), (IMP) myMethodIMP, "v@:");

Runtime 五之动态添加方法_第1张图片

很幸运,如愿以偿,

解释一下这几个参数

1, type(方法类型)用到时直接去官方文档中有详细的介绍

2, C函数中两个隐式参数的意思 :

1, self:方法调用者

_cmd:当前调用方法编号

其中types参数为"f@:@:@“,按顺序分别表示:

f:返回值类型loat,若是v则表示void,i则是int

@:参数id(self)

::SEL(_cmd)

后面的@:定义的tablerowH中的参数 table 和indexpath

你可能感兴趣的:(Runtime 五之动态添加方法)