使用第三方或 MRC 项目

使用第三方或 MRC 项目

#静态库

* 库是分享源代码的一种形式
* 开源库: 像 GitHub 上那些,     闭源库: 静态库.a,.framework, 动态库.dynalib, .framework, 直接给编译好的二进制文件来用, 看不到源代码,
* 闭源库使用区别:
    * 静态库: 链接时, 静态库会被完整的复制到可执行文件中, 被多次使用就会有多份冗余拷贝, 就是同一个系统里, 谁拷贝谁就有一份拷贝
    * 动态库: 链接时不复制, 程序运行时由系统动态加载到内存, 供程序调用, 系统只加载一次, 多个程序共用.节省内存
    * 注意:! 项目中如果使用了自制的动态库, 不能被上传到 AppStore, 像加载库里那些 dylib

* 制作静态库:
    * 选择创建库 -> 将要打包的文件放进去(资源文件:音像图片等不能打包到静态库里) -> 选择暴露的文件:targets -> BuildPhase -> + -> New copy headers...(拷贝头文件暴露出来的意思) -> 在出来的栏目里点+ -> 选择要暴露的文件 -> 导航视图中 Product 文件夹下即是将生成的库文件 -> 选择真机, 编译, 报错可能是没有 importUIKit, 因 CG 是里面的东西, -> 生成.a 文件
    * 注意: 选择真机生成的静态库只能真机上用, 选中模拟器的只能模拟器用, 我们可以手动用命令将它们合并 : 进到文件所在目录, (这个的所在目录也是在缓存里....)
        lipo -create 模拟器.a路径 真机.a路径 -output libxxxx.a(这是自己定名字)
    * 在使用别人的静态库时, 运行有时会失败, 因为库里的方法是给其他设定的分类, 静态库里包含分类,它就不链接, 要加一个链接参数, 不管静态库里有没有分类都导进来: BuildSetting -> 搜索 OtherLinker -> otherlinkerFlags -> +: -ObjC -> 代表不管是不是分类, 所有 OC 代码都链接进来  //// xcode7.2已经做好
    * 这样别人看不到源代码也你能直接用, .a 只能放源码二进制文件, 不能放图片等其他资源, 所以要另外提供才行

    * 这里再补充一下查看静态库.a对处理器架构的支持,先cd到.a文件的路径下,命令行输入:lipo -info xxxxx.a

#bug: 有时候旧文件改动了, 连接出静态库可能有些头文件也要暴露出来, 使用方法也变了!!看看作者文档或主页!!卡了半天!!!, 生成静态库没问题!

#在使用静态库时应该也设定 Building 参数 OtherLinker -ObjC

#bug: 有时候等半天没自动补全, 以为是方法错了, 其实是 xcode 的问题
-[MJRefreshHeader setMj_h:]: unrecognized selector sent to instance 0x79f1aee0
Terminating app due to uncaught exception ‘NSInvalidArgumentException’, reason: ‘-[MJRefreshHeader setMj_h:]: unrecognized selector sent to instance 0x79f1aee0’

设备-->分配数据空间,选择一个固定空间,比如E:\\virtualboxshare

在虚拟机里

##制作.framework

* 创建项目选择 bundle -> 进到 targets.BuildSettings -> 搜索 pack -> packaging.wrapperExtension -> 修改扩展名 bundle 成 framework -> architectures.baseSDK选 iOS -> 回到导航栏.info.plist.bundleOsTypeCode改 BNDL 成FMWk -> 拉入文件(包括媒体资源也可以拉进去, framework 可以放进媒体资源) -> 进到 BuildSetting 设置暴露的头文件 -> 选择真机编译 -> 有时 product 处还是红色, 但可能已经生成了, 在 deriveData 缓存文件里, /Users/mac/Library/Developer/Xcode, 找到对应项目.build.pruduct,就在里面
* 还是真机和模拟器分别编译, 再手动合并(只合并二进制可执行文件, 其他的都一样): 命令一样, 最后把合并的给别人来用
* 可能会出现编译时i386报错, 不好解决, 这时用别人的制作 framework的框架,
* universal-framework, 运行脚本安装后, 可以在新建文件的地方看到 framework 选项, 创建好后设置暴露文件, 编译就可以了, 但是可能还是会出现点问题, runscript 编译报错, 删掉后可通过, 但是加载不出资源文件:单独添加资源文件到项目目录里.

##更新: xcode7.2已经自带这个 framework 模板

#bug: Undefined symbols for architecture x86_64:
“_OBJC_CLASS_$_MJRefreshBackNormalFooter”, referenced from:
objc-class-ref in ViewController.o
“_OBJC_CLASS_$_MJRefreshNormalHeader”, referenced from:
objc-class-ref in ViewController.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
——–搞错了, 将真机的文件拉进去了….
——–其实, 步奏都没错, 只是在 xcode7中要把静态库链接到 embed link 没有做….

#——–其实, 在 Xcode7.2后做的挺完善, 步奏没那么麻烦了, 也自动做了很多设置, 记得最后要在 embed 链接 framework

##最常用的还是.a 的静态库, 原生,稳定. 制作时注意: 如果静态库中需要暴露的头文件比较多, 应该设置一个主头文件, 一般和库同名,包含所有需要暴露的头文件名