软件测试之SDK开发(ios)——分类方法无法调用解决

今天在帮业务接入SDK的时候,发现调用NSObject分类的静态方法的时候,会必现crashunrecognized selector sent to instance,我通过如下代码打印了NSObject的选择器,果然没有该selector。

  unsigned int count;
  Class metaClass = object_getClass([NSObject class]);
  Method *methods = class_copyMethodList(metaClass, &count);
  for (int i = 0; i < count; i++) {
      NSLog(@"%s", sel_getName(method_getName(methods[i])));
  }
  free(methods);

从网上goole了一下,这是因为需要在XCode中Other linker flags配置选项,参考文章:iOS分类方法不能加载

Other linker flags设置的值实际上就是ld命令执行时后面所加的参数,主要有-ObjC -all_load -force_load

  • ObjC:加了这个参数后,链接器就会把静态库中所有的Objective-C类和分类都加载到最后的可执行文件中
  • all_load:会让链接器把所有找到的目标文件都加载到可执行文件中,但是千万不要随便使用这个参数!假如你使用了不止一个静态库文件,然后又使用了这个参数,那么你很有可能会遇到ld: duplicate symbol错误,因为不同的库文件里面可能会有相同的目标文件,所以建议在遇到-ObjC失效的情况下使用-force_load参数。
  • force_load:所做的事情跟-all_load其实是一样的,但是-force_load需要指定要进行全部加载的库文件的路径,这样的话,你就只是完全加载了一个库文件,不影响其余库文件的按需加载

-ObjC -all_load添加完后,工程报duplicate symbol错误,只能使用-force_load,配置如下:
在这里插入图片描述

参考文章

1、https://www.jianshu.com/p/b30c2580d977
2、https://www.jianshu.com/p/471b94af0875
3、https://blog.csdn.net/iostiannan/article/details/50722493

你可能感兴趣的:(软件测试)