美文网首页
Runtime 五之动态添加方法

Runtime 五之动态添加方法

作者: joymake | 来源:发表于2016-08-01 19:11 被阅读28次

    最近项目上出了个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@:");

    很幸运,如愿以偿,

    解释一下这几个参数

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

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

    1, self:方法调用者

    _cmd:当前调用方法编号

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

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

    @:参数id(self)

    ::SEL(_cmd)

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

    相关文章

      网友评论

          本文标题:Runtime 五之动态添加方法

          本文链接:https://www.haomeiwen.com/subject/yzzfjttx.html