iOS 引入framework的常见问题和原理
今天在引入第三方framework时,我按照以前的方法,把framework加入到了下图的地方:

默认是required的,之后程序就crash了,报错dyld: Library not loaded,之后我把required 改成了optional,这次不crash了,但是运行时出错,库中的对象无法实例化,全部是空。
我是根据http://stackoverflow.com/questions/24333981/ios-app-with-framework-crashed-on-device-dyld-library-not-loaded-xcode-6-beta解决的,就是利用Embeded Binaries选项。
先看看optional 和 required 有什么区别,如下是官方的说法:
Libraries and frameworks are designated as Required by default, but you can change this designation to Optional. Required libraries must be present on the host computer for the product to load. Optional libraries do not have to be present for the product to load. A Required framework will always be loaded into memory, but an Optional framework will be loaded only if needed. The initial load of the application will be faster if a large library that is never needed is designated as Optional.
在看看framework的官方说明:
A framework is a hierarchical directory that encapsulates shared resources, such as a dynamic shared library, nib files, image files, localized strings, header files, and reference documentation in a single package. Multiple applications can use all of these resources simultaneously. The system loads them into memory as needed and shares the one copy of the resource among all applications whenever possible.
注意,根据上面的介绍,看起来framework中只能包含 dynamic shared library 2进制文件,其实不是,framework 中也可以包含静态库2进制文件!通过下面这个参数来指定:

这里如果指定为 Static Library(framework中包含的2进制文件就是个静态库),那么当这个framework就可以只加入Linked Frameworks and Libraries 选项卡中,系统会自动识别它的类型,并链接入目标文件。而如果指定为Dynamic Library(framework 中包含的2进制文件就是个动态库) ,那么,加入到 Linked Frameworks and Libraries 选项卡中是不够的,而是需要加入到Embeded Binaries选项卡中,加入后系统会自动为你在Linked Frameworks and Libraries选项卡里加入相同framework,打开对应的ipa,会看到 framework在单独的一个文件夹中。我这里的理解是,Linked Frameworks and Libraries表示连接,动态连接也算连接,所以Embeded Binaries选项卡中中的项目也会出现在Linked Frameworks and Libraries选项卡中。
另外,如果framework中包含的2进制文件是个静态库,而我们把这个framework当成一个包含动态库的framework,添加到了Embeded Binaries选项卡中,那么程序无法通过编译,会报错的。
如何看一个framework中的2进制文件是一个静态库还是一个动态库呢?使用file 命令。
见下面的截图,一个动态库,一个静态库:

看到这里可以明白了,framework就是把以前的.a 和 .so 文件又包装了一层目录,加入了些其他必要的文件,比如以前用.a时需要单独引入的一系列.h文件,这样看起来更规范一些!
这里还有一篇好的博文 http://www.cnblogs.com/huizhang212/p/lipolib.html,说的是如何从.a除去不要的.o文件。

就是说,如果引入了第三方的动态库,这个包含动态库的framework就需要添加到 ipa包中,加载的时机看参数,如果是required,那么程序载入时就加载,如果是optional,那么是使用到时,才加载。如果引入了静态库,这个.a的链接也看参数?不都是需要把部分2进制代码链接入目标文件吗?有什么区别吗?不太明白。我觉得当使用静态库时,这个required 和 optional就没什么用了。
关于创建自定义framework,需要仔细研究一下这篇文章http://www.cocoachina.com/ios/20141126/10322.html
又遇到了一个问题,用embeded 方式加入 lumberjack framework 后,运行时总出如下警告:
objc[]: Class DDTTYLogger is implemented in both /private/var/containers/Bundle/Application/621285FC-47C0--A664-2764018435AD/Gamification.app/Frameworks/CocoaLumberjack.framework/CocoaLumberjack and /var/containers/Bundle/Application/621285FC-47C0--A664-2764018435AD/Gamification.app/Gamification. One of the two will be used. Which one is undefined.
我搜索了工程源码,没有发现其他定义这个类的地方,之后,为了测试,我删掉了 lumberjack framework ,直接加入了lumberjack.a 进行编译,这次直接报错了!这次错误就写的很明白了,原来是工程引入的另一个.a中已经包括了lumberjack的源码,我又没有这个.a的源码,所以在工程中就搜索不到另一个定义。
这也是解决这种类似问题的小技巧吧。
iOS 引入framework的常见问题和原理的更多相关文章
- iOS程序启动的过程及原理
iOS程序启动的过程及原理 文字部分 先执行main函数,main内部会调用UIApplicationMain函数 UIApplicationMain函数里面做了什么事情??? 1> 创建UIA ...
- IOS热更新-JSPatch实现原理+Patch现场恢复
关于HotfixPatch 在IOS开发领域,由于Apple严格的审核标准和低效率,IOS应用的发版速度极慢,稍微大型的app发版基本上都在一个月以上,所以代码热更新(HotfixPatch)对于IO ...
- iOS开发 .framework的Optional(弱引用)和Required(强引用)区别, 有错误 Library not found………………
http://www.cnblogs.com/wanyakun/p/3494323.html 强引用(Required)的framework是一定会被加载到内存的,但是弱引用(Optional)的fr ...
- iOS 打包.framework(包括第三方、图片、xib、plist文件)详细步骤及需要注意的地方
https://www.cnblogs.com/yk123/p/9340268.html // 加载自定义名称为Resources.bundle中对应images文件夹中的图片// 思路:从mainb ...
- iOS中,Framework和.a的打包及使用
最近在做一个小项目,需要给客户一个demo测试,有一部分核心代码暂时不想让客户知道,就想到了打包成framework或.a库.库有两种: 静态库:.a和.framework 动态库:.tbd和.fra ...
- iOS引入JavaScriptCore引擎框架(二)
为何放弃第一种方案 UIWebView的JSContext获取 上篇中,我们通过简单的kvc获取UIWebVIew的JSContext,但是实际上,apple并未给开发者提供访问UIWebVi ...
- iOS引入JavaScriptCore引擎框架(一)
JavaScriptCore引擎 我们都知道WebKit是个渲染引擎,简单来说负责页面的布局,绘制以及层的合成,但是WebKit工程中不仅仅有关于渲染相关的逻辑,也集成了默认的javascri ...
- iOS在线更新framework,使用NSBundle动态读取
官方文档:https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/LoadingCode/Tasks/Loadin ...
- iOS Photos.framework框架
链接: iOS8.0 使用Photos.framework对相册的常用操作 iOS AssetsLibrary和Photos的使用总结: 权限及相册的获取 iOS 开发之照片框架详解 iOS Asse ...
随机推荐
- Vue2.0学习笔记一 :各种表达式
#,过滤器 #,在Vue2.x中,过滤器只能在mustache绑定中使用,为了在指令帮定中实现同样的行为,你应该使用计算属性: #,过滤器可以串联 {{ message | filterA | ...
- 微信快速开发框架(七)--发送客服信息,版本更新至V2.2 代码已更新至github
在V2版本发布的博文中,已经介绍了大多数Api的用法,同时也收到了很多意见,其中发布了几个修正版本,修改了几个bug,在此感谢大家的使用,有了大家的支持,相信快速开发框架会越来越好,也会越来越完善的. ...
- Mysql查看执行计划-explain
最近生产环境有一些查询较慢,需要优化,于是先进行业务确认查询条件是否可以优化,不行再进行sql优化,于是学习了下Mysql查看执行计划. 语法 explain <sql语句> 例如: e ...
- js学习笔记9----时间操作
1.时间操作函数如下: new Date(); //获取系统时间 getFullYear(); //年 getMonth()+1; //月,初始值为0 getDate(); //日 getDay( ...
- 红米3 SudaMod(android_6.01_r72)高配指纹/农历/归属地/SM天气/流畅运行/红外线正常/更新于20161025
一.写在前面 我只是个人爱好,本ROM未集成任何第三方推广软件,我只是喜欢把好的资源分享出来,若可以,我们一起学习,一起进步. 请不要问我怎么刷机! 请不要问我玩游戏卡不卡(有钱你就换好点的手机)! ...
- js判断浏览器类型以及浏览器版本
判断浏览器类型: if navigator.userAgent.indexOf(”MSIE”)>0) {} //判断是否IE浏览器 if(isFirefox=navigator.userAg ...
- HTML实现点击时的阴影(:active)(已解决iOS微信上无法使用)
一般是用这个委类:active 参考:http://www.w3school.com.cn/cssref/selector_active.asp 但是业界上实现的效果中,今日头条的手机端网页却不是这样 ...
- jQuery datatables
jQuery datatables 属性,用例 参考:http://datatables.club/example/ http://blog.csdn.net/mickey_miki/article/ ...
- javascript面向对象:继承、多态
继承 js中同样可以实现类的继承这一面向对象特性,继承父类中的所有成员(变量和属性),同时可扩展自己的成员,下面介绍几种js中实现继承的方式: 1,对象模仿:通过动态的改变 this 指针的指向,实现 ...
- MapReduce的ReduceTask任务的运行源码级分析
MapReduce的MapTask任务的运行源码级分析 这篇文章好不容易恢复了...谢天谢地...这篇文章讲了MapTask的执行流程.咱们这一节讲解ReduceTask的执行流程.ReduceTas ...