发布时间:2023-11-27 17:47:35 浏览量:116次
一、概念
静态库:以.a 和 .framework为文件后缀名。
动态库:以.tbd(之前叫.dylib) 和 .framework 为文件后缀名。
二、区别
静态库:链接时会被完整的复制到可执行文件中,被多次使用就有多份拷贝。
动态库:链接时不复制,程序运行时由系统动态加载到内存,系统只加载一次,多个程序共用(如系统的UIKit.framework等),节省内存。
注意:但是苹果不让使用自己的动态库,否则审核就无法通过。所有我们制作SDK通常都是指静态库
注意点
1、项目名、里面的各种类名、文件名和方法名最好都 带上自己的前缀。
2、SDK的文件分层要以模块和功能进行划分。
3、在进行资源操作如图片加载、文件读取时,要对对应的方法进行封装处理,方便对资源的统一处理,如对UIImageView 设置图片的方法进行二次封装。
4、能不使用第三方类库就不使用,假如真的需要就最好是对第三方类库进行重命名和方法名修改,以防止SDK使用方的项目中类库文件和方法冲突。
5、要对SDK中需要用到的依赖文件进行记录以方便做文档。
6、SDK中尽量不要使用分类Category,因为会涉及到一个资源加载的问题,会使得SDK包变大。使用起来当然也是没有任何问题,只需要添加-all_load或-ObjC就可以。
7、制作的SDK需要注意debug模式和Realease模式,debug模式只是一般的测试,Realease才可进行上商店。
关于-ObjC
这个flag告诉链接器把库中定义的Objective-C类和Category都加载进来,这样编译之后的app会变大(因为加载了其他的objc代码进来)但是如果静态库中有类和category的话只有加入这个flag才行
关于-all_load
这个flag是专门处理-ObjC的一个bug的。用了-ObjC以后,如果类库中只有category没有类的时候这些category还是加载不进来。变通方法就是加入-all_load或者-force-load。-all_load会强制链接器把目标文件都加载进来,即使没有objc代码。-force_load在xcode3.2后可用。但是-force_load后面必须跟一个只想静态库的路径。
关于-force_load
如果有多个三方库,有的需要加,有的不需要,用-all_load到最后duplicate symbol错误此时可以用-force_load + 路径方式
1、SDK库的含义:
共享程序代码的方式,可以对自己的项目进行封装,生成库,方便别人的使用。
2、SDK库的分类:
A、静态库,链接时完整地拷贝至可执行文件中,被多次使用就有多份冗余拷贝。
B、动态库,链接时不拷贝,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序共用,节省内存。
3、SDK库的形式:
A、.a与.framework文件是静态库(.framework属于自己创建),自己创建的.framework是静态库文件。
B、.tbd(Xcode7和iOS9 之前是.dylib文件)与.framework文件是动态库(.framework属于系统自带),系统自带的.framework是动态库文件。
4、静态库和动态库的区别:
《1》.a是一个纯二进制文件,不能直接使用,至少要有.h文件配合
《2》.framework中除了有二进制文件之外还有资源文件,可以直接使用。
.framework = .a(二进制文件) + .h (头文件) + resourceFile (资源文件)
5、静态库的使用优点:
《1》方便程序共享代码,便于合理规范使用。
《2》 可以实现iOS程序的模块化,可以把固定的业务模块化成静态库。
《3》能够与别人分享你的代码库,但又不想让别人看到你代码如何实现。
《4》开发第三方SDK的业务模块需求。
6、静态库的制作的注意点:
《1》.a是二进制文件,需要配合.h头文件和其它文件才能使用,.framework可以直接使用。
《2》图片资源的处理可以使用.bundle文件,.bundle文件的名字和.a或.framework的名字相同。
《3》.bundle文件的简单制作如下:
首先,新建一个文件夹;
其次,修改文件夹的后缀名为.bundle ;
最后,点击右键,打开显示包内容,就可以向其中添加图片资源。
《4》category文件打包成静态库文件再添加到工程,调用分类方法时会有找不到该方法的运行时错误(selector not recognized),解决办法就是在静态库的工程中配置other linker flags的值为-ObjC。
《5》如果静态库很复杂,需要暴露的.h头文件比较多,可以在静态库内部创建一个.h文件(一般这个.h文件的名字和静态库的名字相同),然后把需要暴露的.h头文件显示,不需要暴露的.h头文件集中放在这个内部创建的.h文件。
7、创建.a静态库文件流程如下:
《1》创建一个.a静态库工程
Xcode ——》File\New\Project ——》iOS\Framework and Library\Cocoa Touch Static Library ——》命名项目工程 ——》保存目录
《2》一个静态库工程由头文件和实现文件组成(TestSDK.h和TestSDK.m),这些文件将被编译为库本身。由于不需要实现文件,需要右键单击TestSDK.m删除该文件并移动到废纸篓。
《3》创建一个自己封装的控件,然后拷贝到Xcode项目工程目录里面。注意拷贝的时候,要勾选3个选项,Copy items id needed、 Create groups和TestSDK。
《4》添加控件的.h头文件到库的主头文件TestSDK.h中
《5》生成静态库的形式:
A、模拟器,只有在模拟器才能编译运行
Build only Device ——》show in Finder ——》拿到模拟器的.a二进制文件和其它所有的.h头文件
B、真机,只有在手机端才能编译运行
iOS Simulators ——》show in Finder ——》拿到真机的.a二进制文件和其它所有的.h头文件
《6》合成真机与模拟器.a文件,这样可以在真机和模拟器都能够编译运行,终端命令如下:
lipo -create
模拟器.a文件目录
真机.a文件目录
-output 输出目录/TestSDk.a, 获取的TestSDk.a文件兼容模拟器和真机的二进制文件。
8、创建.framework静态库文件流程如下:
《1》创建一个.framework静态库工程
Xcode ——》File\New\Project ——》iOS\Framework and Library\Cocoa Touch Framework ——》命名项目工程 ——》保存目录
《2》创建两个新的工具类,或者向项目工程拖入一个相对完整的功能模块。
《3》在项目工程中添加所依赖的框架
Xcode ——》Project ——》Targets ——》Build Phases ——》Link Binary With Libraries
《4》在项目工程中设置要暴露的头文件接口,设置Public和Private,选择相应的运行设备。
Xcode ——》Project ——》Targets ——》Build Phases ——》Headers
《5》在项目工程中添加脚本
Xcode ——》Project ——》Targets ——》Build Phases ——》New Run Script Phase ——》 添加shell脚本
加入下面的脚本将模拟器和真机的Framework合并,如下所示:
if [ "${ACTION}" = "build" ]
then
INSTALL_DIR=${SRCROOT}/Products/${PROJECT_NAME}.framework
DEVICE_DIR=${BUILD_ROOT}/${CONFIGURATION}-iphoneos/${PROJECT_NAME}.framework
SIMULATOR_DIR=${BUILD_ROOT}/${CONFIGURATION}-iphonesimulator/${PROJECT_NAME}.framework
if [ -d "${INSTALL_DIR}" ]
then
rm -rf "${INSTALL_DIR}"
fi
mkdir -p "${INSTALL_DIR}"
cp -R "${DEVICE_DIR}/" "${INSTALL_DIR}/"
#ditto "${DEVICE_DIR}/Headers" "${INSTALL_DIR}/Headers"
lipo -create "${DEVICE_DIR}/${PROJECT_NAME}" "${SIMULATOR_DIR}/${PROJECT_NAME}" -output "${INSTALL_DIR}/${PROJECT_NAME}"
#open "${DEVICE_DIR}"
open "${SRCROOT}/Products"
fi
《6》点击Xcode左上角的运行按钮,然后脚本就自动弹出生成的Framework库文件。
《7》如果其他项目工程导入这个Framework库,编译报错,需要让编译器提前编译这个二进制文件,做法是Xcode->General->Embedded Binaries,将系统依赖的Framework添加上去即可。
《8》最后,Framework的核心在于内部结构的设计,谨慎设计你的每一个接口,在每个对外暴露的方法中需要做好注释,然而一份通用的接口文档也是必须的。
热门资讯
探讨游戏引擎的文章,介绍了10款游戏引擎及其代表作品,涵盖了RAGE Engine、Naughty Dog Game Engine、The Dead Engine、Cry Engine、Avalanche Engine、Anvil Engine、IW Engine、Frostbite Engine、Creation引擎、Unreal Engine等引擎。借此分析引出了游戏设计领域和数字艺术教育的重要性,欢迎点击咨询报名。
游戏中玩家将面临武侠人生的挣扎抉择,战或降?杀或放?每个抉定都将触发更多爱恨纠葛的精彩奇遇。《天命奇御》具有多线剧情多结局,不限主线发展,高自由...
3. 手机游戏如何开发(如何制作传奇手游,都需要准备些什么?)
如何制作传奇手游,都需要准备些什么?提到传奇手游相信大家都不陌生,他是许多80、90后的回忆;从起初的端游到现在的手游,说明时代在进步游戏在更新,更趋于方便化移动化。而如果我们想要制作一款传奇手游的
4. B站视频剪辑软件「必剪」:免费、炫酷特效,小白必备工具
B站视频剪辑软件「必剪」,完全免费、一键制作炫酷特效,适合新手小白。快来试试!
UI设计师、动画设计师、特效设计师每一个职位的功能和负责的方面都不同。所以,3D美术这方面需要大量的人才。但是要成为一个3D游戏建模师,也不是那么...
三昧动漫对于著名ARPG游戏《巫师》系列,最近CD Projekt 的高层回应并不会推出《巫师4》。因为《巫师》系列在策划的时候一直定位在“三部曲”的故事框架,所以在游戏的出品上不可能出现《巫师4》
7. 3D动画软件你知道几个?3ds Max、Blender、Maya、Houdini大比拼
当提到3D动画软件或动画工具时,指的是数字内容创建工具。它是用于造型、建模以及绘制3D美术动画的软件程序。但是,在3D动画软件中还包含了其他类型的...
众所周知,虚幻引擎5(下面简称UE5)特别占用存储空间,仅一个版本安装好的文件就有60G,这还不包括我们在使用时保存的工程文件和随之产生的缓存文件。而...
想让你的3D打印模型更坚固?不妨尝试一下Cura参数设置和设计技巧,让你轻松掌握!
了解Unity3D游戏开发中常用的框架及其特点,包括Unity UI、Photon Unity Networking、Cinemachine、TextMeshPro、Shader Graph、DOTS、AR Foundation和SteamVR,帮助开发人员选择合适的框架提升游戏功能。
最新文章
1. 打开微信扫一扫,扫描左侧二维码
2. 添加老师微信,马上领取免费课程资源
同学您好!