真机调试错误 Reason: image not found想到的

    想起之前再给一个旧版本手机build测试版本的时候,发生了一个错误:


    第一次遇到这个问题的时候,我看到是最后一行:Reason: image not found ,说出来不怕笑话,我第一反应是觉得有某些图片丢失了,然后开始了漫漫地寻找丢失图片之路。。。

    此处省略10k字。。。

    好吧,大侠请重新来过,认真研究这几行提示,说是有一个动态库没有被载入。。。    

dyld: (the dynamic link editor)动态链接器,其源码是开源的。
image: 程序中对应实例可简称为image(如程序可执行文件,Framework库,bundle文件)。
dyld主要负责初始化程序环境,将可执行文件以及依赖库与插入库加载进内存生成对应的image(镜像文件)对象,
对这些image进行链接,调用各image的初始化方法等。  

    此image非彼image。。。现在想起来还是觉得当时自己挺搞笑的。。。

    一看这个动态库的名字 UserNotificationsUI.framework 这是ios10之后才支持的,然而现在的目标手机是ios9+版本,所以造成了无法载入这个库的错误,

    从代码里找到:

#import  

    我们知道ios10之后的版本注册通知需要导入这个头文件,难道是导入这个头文件之后,会加载那个动态库吗?

    为了更直观我直接创建一个新的程序,

真机调试错误 Reason: image not found想到的_第1张图片

    只在这里面添加这个动态库,然后给ios9+版本的手机build,发现即是不导入头文件该动态库也会被加载,又出现了之前的image not found 的错误。

    接着看这个动态库的选项(Status),发现有Required和Optional两种,尝试把Status换成Optional,重新build,发现通过了。

    查阅相关资料后发现:

强引用(Required)的framework是一定会被加载到内存的,
但是弱引用(Optional)的framework只在需要时才会被载入内存,

    原来是酱紫。。。ios9+的手机载入了本身不存在的库,所以导致了错误。

    好了,改为Optional,搞定,吃饭去了。    

你可能感兴趣的:(iOS)