最近项目上出了个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
网友评论