前两天公司线上项目突然出现奔溃现象,发了一个报错截图让我看,内容为:
‘unrecognized selector sent to instance 0x7f9029630bc0’,
很奇怪怎么会出现这种境况,想了一会问了一下其他的开发人员,是不是在集成我给的静态库后忘记在Other Linker Flags添加-ObjC或者-all_load,确认没有后重新添加程序正常运行了.
我们在日常开发中,会用到第三方静态库(.a文件)或者自己打包静态库供别人使用,会在Other Linker Flags中添加-ObjC或-all_laod或-force_load下面简单介绍下各种用途:

  • 链接器
    首先先介绍下Other Linker Flags,说白了,就是ld命令除了默认参数外的其他参数.id命令实现的是链接器的工作,详细说明可以在终端man id查看.
    一个程序从简单易读的代码到可执行文件往往要经历以下步骤:
    源代码 > 预处理器 > 编译器 > 汇编器 > 机器码 > 链接器 > 可执行文件

    源文件经过一系列处理以后,会生成对应的.obj文件,然后一个项目必然会有许多.obj文件,并且这些文件之间会有各种各样的联系,例如函数调用。链接器做的事就是把这些目标文件和所用的一些库链接在一起形成一个完整的可执行文件。

  • 闪退原因
    苹果官方Q&A上有这么一段话:
    The “selector not recognized” runtime exception occurs due to an issue between the implementation of standard UNIX static libraries, the linker and the dynamic nature of Objective-C. Objective-C does not define linker symbols for each function (or method, in Objective-C) - instead, linker symbols are only generated for each class. If you extend a pre-existing class with categories, the linker does not know to associate the object code of the core class implementation and the category implementation. This prevents objects created in the resulting application from responding to a selector that is defined in the category.
    翻译过来,大概意思就是Objective-C的链接器并不会为每个方法建立符号表,而是仅仅为类建立符号表.这样,如果静态库中定义了已存在的一个类的分类,链接器就会以为这个类已经存在,不会把分类和核心代码结合起来.这样的话,在最后的可执行文件中,就会缺少分类里的代码,这样函数调用就失败了.

  • 方法分析
    1.-ObjC:加了这个参数后,链接器就会把静态库中所有的Objective-C类和分类都加载到最后的可执行文件中,虽然这样可能会因为加载了很多不必要的文件而导致可执行文件变大,但是这个参数很好地解决了我们所遇到的问题.

    当静态库中只有分类而没有类的时候,-ObjC参数就会失效了。这时候,就需要使用-all_load或者-force_load了.

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

Xcode里的-ObjC,-all_laod和-force_load的作用相关推荐

  1. Xcode里-ObjC, -all_load, -force_load

    最近在做一个项目的时候,需要使用到一个第三方库,这个库的使用向导里面特别说明,在添加完该库后,需要在Xcode的Build Settings下Other Linker Flags里面加入-ObjC标志 ...

  2. Xcode中的-ObjC和-all_load

    有时候使用第三方库的时候,需要在Xcode的Build Settings下Other Linker Flags里面加入-ObjC标志. 之所以使用该标志,和Objective-C的一个重要特性:类别( ...

  3. c语言windows.h file not found,XCode里遇到 #include XXX.hfile not found的解决方案

    最近在学习如何在C++里调用Java方法,遇到提示 #include file  not  found 的问题.也google了好久都没有找到合适的解决方案. 认真的研究了下xcode导入h头文件的的 ...

  4. xcode里的描述文件 位置

    xcode里的描述文件 位置 ~/Library/MobileDevice/Provisioning Profiles

  5. SAP MM PR单据类型的配置里‘Control’和’Doc.Type’字段的作用?

    SAP MM PR单据类型的配置里'Control'和'Doc.Type'字段的作用? Control:如果选成了T,是使用于STO(公司间转储或者公司内转储),需要将Plant当作VENDOR. C ...

  6. continue语句只用于循环语句中_循环里continue,break,return的作用,你知道吗?

    循环里continue,break,return的作用,你知道吗?​mp.weixin.qq.com 前言 循环里Continue,Break,Return经常会用到,也是很容易出错的一个坑,今天特地 ...

  7. 在MTK平台里,,函数kal_prompt_trace起什么作用???Kal_prompt_trace的参数有表示什么?...

    在MTK平台里,,函数kal_prompt_trace起什么作用???Kal_prompt_trace的参数有表示什么?一直弄不明白,但是很多函数的开头就是这个函数,,而且一般有三个参数-- kal_ ...

  8. 怎样解决xcode里开发cocos2dx改动lua脚本后不刷新的问题

    用xcode来开发cocos2dx,结果发现一个非常纠结的问题,假设我一旦改动了一个Lua文件,我必须clean之后再build,否则改动的Lua文件不会体现出来.这是一个非常令纠结的结果,特别是我要 ...

  9. xcode中不小心删除了xcode里面的storyboard怎么办?

    我们知道,现在苹果是主推使用故事版进行iOS开发的,它可以让我们进行可视化界面的设计.可是我们往往在storyboard上为界面的设计花费大量的时间和精力,不断地添加视图.添加控件.设置约束.设置se ...

  10. 当xcode里点运行出现treating unicode character as whites

    可能是由于粘贴网页上的代码的时候两行之间的回车引起的,两行之间重新输入回车就行......删掉重新写一遍就ok了 转载于:https://www.cnblogs.com/56ik/p/5262795. ...

最新文章

  1. R语言optim函数进行函数优化实战(和lm函数进行对比)
  2. Linux CentOS 修改服务器主机名hostname
  3. 详细解读Python 递归函数!
  4. MVC实用架构设计(三)——EF-Code First(1):Repository,UnitOfWork,DbContext
  5. 题解 牛客【「水」悠悠碧波】
  6. 东农计算机应用与技术,东农16春《计算机应用与技术》在线作业.doc
  7. paip.银行卡号的效检
  8. docker 命令_Docker的入门:安装Docker及记住常用的镜像命令和容器命令
  9. 在虚幻引擎5中构建你的首款游戏 - 03 - 模型和材质蓝图
  10. 黑苹果卡在白苹果不动_从黑苹果到“白苹果”这一年我经历了什么
  11. 阿里云企业邮箱有免费的吗?如何申请?
  12. 皮皮虾无水印解析源码实战
  13. 无线路由器信号互相干扰怎么办
  14. 骨传导耳机工作原理是什么、为什么骨传导耳机塞住耳朵声音变大?
  15. 关于计算机面试重难点 之 操作系统,字节架构师有话说
  16. 关于hive异常:Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStor
  17. 用Java模拟微信红包的实现
  18. Ruby on Rails社区网站开发
  19. 华为岗位分类对工作的分析与启示
  20. python如何将文件内容合并_python如何将两个txt文件内容合并

热门文章

  1. 植树节推文如何排版?—135植树节样式上新
  2. 支付宝没有优势了,五大银行宣布今起手机银行转账汇款免收手续费
  3. 14 POJ3363 Annoying painting tool
  4. VBA轻松实现多色渐变填充
  5. appinventor计算机教程,App Inventor编程开发集锦2-计算器-第2课-实现常规操作
  6. 数字逻辑电路——反演规则与对偶规则
  7. hadoop之hdfs
  8. c/c++实现带图形界面的扫雷游戏
  9. 强化学习——Sarsa算法
  10. ff7重制版青魔法_《FF7重制》敌方招式获取方式与效果