iOS中静态库的形式:.a .framework iOS中动态库的形式:.dylib .frameworkhtml
其中系统的.framework是动态库,本身建立的.framework是静态库 将Mach-O Type设为Static Library,framework能够是动态库也能够是静态库,对于系统的framework是动态库,而用户制做的framework只能是静态库。xcode
iOS8.0之后支持的动态库架构
静态库和动态库的区别: 静态库:连接时完整拷贝到可执行文件中,屡次使用就有多分拷贝 动态库:连接时不复制,程序运行时由系统动态加载到内存,系统加载一次,多个程序共用app
首先,framework中的资源再也不mainbundle中,下面两种方式均可以访问其所在bundle:url
//方法1:在framework中的随便一个类中便可访问 NSBundle *bundle = [NSBundle bundleForClass:self.class]; //方法2:在任何地方均可以访问,其中com.xy.framwork为framework的CFBundleIdentifier NSBundle *bundle = [NSBundle bundleWithIdentifier:@"com.xy.framwork"];
而后就能够拿这个bundle来访问资源了操作系统
//访问图片 UIImage *image = [UIImage imageNamed:imageName inBundle:bundle compatibleWithTraitCollection:nil]; //访问文件,使用NSBundle的实例方法获取文件url或者路径 NSURL *sourceUrl = [bundle URLForResource:productName withExtension:@".xml" subdirectory:subDir]; NSString *filePath = [bundle pathForResource:productName ofType:@"xml" inDirectory:subDir];
Linked Frameworks and Libraries: 系统的framwork或者扩展程序中使用主程序中的framwork的时候,不须要把framwork包含到程序的bundle中,使用该模式code
对于静态库(.a):该方式会将静态库中的代码拷贝到主程序的ipa包中,ipa包体积也会随之变大;在运行时不须要再处理依赖关系,全部的事情都在编译连接阶段完成;xml
对于动态库(.dylib、ystem-supplied framework):会将动态库放到系统的动态库存放目录,这样就不须要将第三方的外部库拷贝到主程序的ipa中,而且不一样的程序均可以找到它使用它,这不只节省了安装包大小,同时还节省了内存占用。htm
当使用一个第三方的framwork(下载的或者本身生成的),它们并不会被放到操做系统上,在这种状况下,仅仅linked这个库就不行了,还须要在"Copy Frameworks" 时期把它嵌入到应用的ipa包里面,这样,在程序运行的时候,发如今系统动态库目录下找不到这个库,就能在应用程序包里面找到并使用它。
embed到应用中的动态库,就像是图片、音频等资源文件同样,只不过它是一个可执行文件,在运行时采起加载执行。
一个动态库A.framework包含了另一个动态库B.framework,而后将A提供给主工程使用;这种状况下,若是只提供了A给主工程,那么会在运行时报 image not found 的错误,查看了苹果文档, 发如今iOS开发中不支持这种作法,必须在主工程中同时embedA和B才能正常运行
#####如何区分一个framwork是静态库仍是动态库:
命令行进入动态库文件,使用file命令能够看到区别,分别以腾讯分享framwork(静态)和阿里直播framwork(动态)为例展现:
cd TencentOpenAPI.framework file TencentOpenAPI
输出
TencentOpenAPI: Mach-O universal binary with 4 architectures: [arm_v7:current ar archive] [arm64] TencentOpenAPI (for architecture armv7): current ar archive TencentOpenAPI (for architecture i386): current ar archive TencentOpenAPI (for architecture x86_64): current ar archive TencentOpenAPI (for architecture arm64): current ar archive
archive代表这是一个静态库
cd AliyunPlayerSDK.framework file AliyunPlayerSDK
输出
AliyunPlayerSDK: Mach-O universal binary with 4 architectures: [i386:Mach-O dynamically linked shared library i386] [arm64] AliyunPlayerSDK (for architecture i386): Mach-O dynamically linked shared library i386 AliyunPlayerSDK (for architecture x86_64): Mach-O 64-bit dynamically linked shared library x86_64 AliyunPlayerSDK (for architecture armv7): Mach-O dynamically linked shared library arm_v7 AliyunPlayerSDK (for architecture arm64): Mach-O 64-bit dynamically linked shared library arm64
dynamically linked shared library代表这是一个动态库