iOS制作动态库

简介: iOS制作动态库

iOS制作动态库Demo,iOS生成Bundle 资源文件包。

如果我们有些功能要给别人用,但是又不想公开代码实现,这时候我们就要打包成库了。库分静态库和动态库两种:

静态库:以.a 和 .framework为文件后缀名。

动态库:以.tbd(之前叫.dylib) 和 .framework 为文件后缀名。

静态库与动态库的区别

静态库:链接时会被完整的复制到可执行文件中,被多次使用就有多份拷贝。

动态库:链接时不复制,程序运行时由系统动态加载到内存,系统只加载一次,多个程序共用(如系统的UIKit.framework等),节省内存。

静态库和动态库是相对编译期和运行期的:静态库在程序编译时会被链接到目标代码中,程序运行时将不再需要改静态库;而动态库在程序编译时并不会被链接到目标代码中,只是在程序运行时才被载入,因为在程序运行期间还需要动态库的存在。

静态库 好处:

模块化,分工合作,提高了代码的复用及核心技术的保密程度

避免少量改动经常导致大量的重复编译连接

也可以重用,注意不是共享使用

动态库 好处:

使用动态库,可以将最终可执行文件体积缩小,将整个应用程序分模块,团队合作,进行分工,影响比较小

使用动态库,多个应用程序共享内存中得同一份库文件,节省资源

使用动态库,可以不重新编译连接可执行程序的前提下,更新动态库文件达到更新应用程序的目的。

应用插件化

软件版本实时模块升级

iOS8之后,iOS有了App Extesion特性,而且Swift也诞生了。由于iOS主App需要和Extension共享代码,Swift语言机制也需要动态库,于是苹果后来提出了Embedded Framework,这种动态库允许APP和APP Extension共享代码,但是这份动态库的生命被限定在一个APP进程内。简单点可以理解为被阉割的动态库。

但是这种动态库(Embedded Framework) 和系统的 UIKit.Framework 还是有很大区别,传统的动态库是给多个进程用的,而这里的动态库(Embedded Framework)是给单个进程里面多个可执行文件用的。系统的 Framework 不需要拷贝到目标程序中,我们自己做出来的 动态库(Embedded Framework) 哪怕是动态的,最后也还是要拷贝到 App 中(App 和 Extension 的 Bundle 是共享的)。所以苹果没有直接把这种Embedded Framework称作动态库而是叫Embedded Framework。

iOS中的Embedded Framework可以理解为独立的没有main函数的可执行文件。

静态库可以简单理解为一堆目标文件(.o/.obj)的打包体(并非二进制文件),而动态库可以简单理解为 一个没有main函数的可执行文件。

版本

真机-Debug版本

真机-Release版本

模拟器-Debug版本

模拟器-Release版本

Debug


含完整的符号信息,以方便调试

不会对代码进行优化

Release


不会包含完整的符号信息

的执行代码是进行过优化的

的大小会比Debug版本的略小

在执行速度方面,Release版本会更快些(但不意味着会有显著的提升)

下面说下动态库的制作过程:

1.点击File-New-Project

2.输入动态库的名字

3.修改工程文件配置

build setting ->搜索 Mach-O Type -> 修改 Mach-O Type ->Dynamic Library。

4.File->New->Target->Cross-platform->Aggregate,取名为CommonDylib。

5.在其Target Dependencies中`添加SDKDemo。

6.点击下图中的 + 号,选择run script,添加如下脚本

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


7.把你制作的SDKDemoBundle.bundle加载到工程中。把你的SDKDemoViewController.m,SDKDemoViewController.h, MBProgressHUD.h和MBProgressHUD.m加载到工程中具体文件自己定义。生成一个SDKDemo.h文件。

代码如下:

#import <UIKit/UIKit.h>

//! Project version number for SDKDemo.
FOUNDATION_EXPORT double SDKDemoVersionNumber;

//! Project version string for SDKDemo.
FOUNDATION_EXPORT const unsigned char SDKDemoVersionString[];

// In this header, you should import all the public headers of your framework using statements like #import <SDKDemo/PublicHeader.h>
#import<SDKDemo/SDKDemoViewController.h>

8.设置公开头文件。点击下图(9步骤中的图)的加号可以加入公开文件。若你是把原来的目录拖入工程的需要自己加文件。强力建议直接把文件或文件夹拷贝到工程目录下直接加载,那么他们的头文件自动加入到工程头文件中(Header下)。.m文件自动加入到Compile Sources下。

9.加入头文件后这个样子都在工程目录下需要,需要把它移动到公开头文件区域

10.编译SDK

分别将sdk在模拟器(随便选一款模拟器)和Generic iOS Device下编译 (选择该target,command + B)。这会编译生成2个SDK,一个适用于模拟器,一个适用于真机。

10.可以看到Products下的SDKDemo.framework由红变黑。

Debug-iphoneos文件夹下的是真器使用的动态库文件,Debug-iphonesimulator文件夹下的是模拟器使用的动态库文件。

12.若需要生成发布的动态库,需要修改环境设置Release,在Generic iOS Device下编译 (选择该target,command + B)生成发布版本的动态库。


目录
相关文章
|
6月前
|
Swift 数据安全/隐私保护 iOS开发
iOS使用动态库
iOS使用动态库
64 0
|
缓存 iOS开发 C++
iOS 逆向编程(二十三)dsc_extractor 动态库提取器
iOS 逆向编程(二十三)dsc_extractor 动态库提取器
181 1
|
iOS开发
Xcode3创建和使用iOS的dylib动态库
此文真正写于2011年4月,当时是xcode3.X版本。xcode4的路径会不同,方法请查看 Xcode4.6创建和使用iOS的dylib动态库。 文中提到的压缩文件在此下载http://download.
1441 0
|
编译器 iOS开发 开发者
[iOS研习记]——谈谈静态库与动态库
在iOS项目开发中,静态库和动态库我们时刻都在使用,离开了库的支持,我们将会举步维艰。比如,你要画界面,总离不开UIKit这个库吧,你要使用的各种基础数据结构,如NSString,NSArray等,也离不开Foundation这个基础库。除了官方的库外,开发中我们也会从Github等开源社区下载第三方的开源库进行使用。一般我们使用的第三方库或自己开发的库都采用静态库的方式使用,而系统提供的库大多是动态库,方便多进程共享。虽然我们天天在用库,但你对静态库和动态库真的了解么?静态库和动态库的结构是怎样的?静态库和动态库有什么区别?它们又是怎么应用的?本节博客,我们就来聊一聊这些问题。
290 0
|
iOS开发 编译器 前端开发
# iOS 使用 InjectionIII 注入动态库实现快速调试
通过继 InjectionIII 让我们在编写代码的时候, 不需要经历漫长的编译等待, 然后重启来执行修改后的代码。 有效的提高调试速度!!!!
2761 0
|
Linux 开发工具 iOS开发
【视频云端】iOS库冲突的问题---动态库导入
1.什么是库 首先来看什么是库,库(Library)说白了就是一段编译好的二进制代码,加上头文件就可以供别人使用。 什么时候我们会用到库呢?一种情况是某些代码需要给别人使用,但是我们不希望别人看到源码,就需要以库的形式进行封装,只暴露出头文件。
5583 0
|
测试技术 iOS开发 MacOS
[IOS]iOS中创建,使用动态库(dylib)
测试环境: xcode4.5.2   Mac OS X 10.8.2 重要:由于苹果不支持自己创建动态库,所以这里需要替换两个文件 1:iOS Device 需要替换的文件 替换路径:/Applications/Xcode.
2648 0
|
iOS开发 数据安全/隐私保护
Xcode4.6创建和使用iOS的dylib动态库
此为xcode4的方法,xcode3的方法请查看 Xcode3创建和使用iOS的dylib动态库 找到两个目录,最好用两个finder窗口分别打开: 目录一: /Applications/Xcode.
848 0
|
1月前
|
Java Android开发 Swift
安卓与iOS开发对比:平台选择对项目成功的影响
【10月更文挑战第4天】在移动应用开发的世界中,选择合适的平台是至关重要的。本文将深入探讨安卓和iOS两大主流平台的开发环境、用户基础、市场份额和开发成本等方面的差异,并分析这些差异如何影响项目的最终成果。通过比较这两个平台的优势与挑战,开发者可以更好地决定哪个平台更适合他们的项目需求。
109 1
|
6天前
|
安全 数据处理 Swift
深入探索iOS开发中的Swift语言特性
本文旨在为开发者提供对Swift语言在iOS平台开发的深度理解,涵盖从基础语法到高级特性的全面分析。通过具体案例和代码示例,揭示Swift如何简化编程过程、提高代码效率,并促进iOS应用的创新。文章不仅适合初学者作为入门指南,也适合有经验的开发者深化对Swift语言的认识。
24 9