ACCESS静态库、动态库的区分汇总

real framework中不可以以类 或 不得以无含有类公事

real framework 中直接调用NSClassFromString函数会回来null
 需要强制加载指定类 或 直接通过类名引用

linux中静态库和动态库的别

一、不同

仓库从实质上吧是一律种而尽代码的第二前进制格式,可以被载入内存中执行。库分静态库和动态库两栽。 

  1. 静态函数库

   
这类似库底讳一般是libxxx.a;利用静态函数库编译成的公文于好,因为任何
函数库底享有数据都见面给整合进目标代码中,他的优点就是明显了,即编译后底实践顺序不欲外部的函数库支持,因为有着应用的函数都曾深受编译进去了。当然就为会变成外的缺陷,因为若静态函数库改变了,那么你的次必须另行编译。

  1. 动态函数库

    这类似库底讳一般是libxxx.so;相对于静态函数库,动态函数库在编译的当儿
并没于编译进目标代码中,你的程序执行到有关函数时才调用该函数库里之相应函数,因此动态函数库所发出的可执行文件比较小。由于函数库没有吃整合进你的程序,而是程序运行时动态的报名并调用,所以程序的运转环境中要提供对应的库房。动态函数库底改并无影响你的程序,所以动态函数库的升迁比较方便。

二、相同

都是由*.o目标文件生成

ios 开发中 动态库 与静态库的界别

用静态库的益处

1,模块化,分工合作

2,避免少量改经常造成大气之再度编译连接

3,也可引用,注意不是共享利用

动态库使用产生如下好处:

1使用动态库,可以以最后可执行文件体积缩小

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

3运用动态库,可以不还编译连接可执行程序的前提下,更新动态库文件及更新应用程序的目的。

自1足得出,将不折不扣应用程序分模块,团队合作,进行分工,影响比较小。

等其他利益,

从今2好望,其实动态库应该于共享库,那么由夫意思及来说,苹果禁止iOS开发被动用动态库就得理解了:

以以现在之iPhone,iPodTouch,iPad上面程序都是独进程的,也不怕是有平整日才发一个过程在运转,那么您写单一起享库,

       
—-共享给何人?(你用的时节只有你一个应用程序存在,其他的应有叫挂于了,即便是可以以多个过程运行,别人能下你的共享库里的物啊?你是是深受您协调的主次定制的。)

       
—-目前苹果的AppStore不支持模块更新,无法创新某个单独文件(除非自己写一个翻新机制:有协调的服务端放置最新动态库文件)

有关苹果也甚禁止ios开发使用动态库我就猜到上面俩缘由

深入明iPhone静态库

      
在实质上的编程过程中,通常会拿一部分公用函数制成函数库,供其他程序用,一虽然取为了代码的复用;二虽取来了核心技术的保密程度。所以当事实上的色支付被,经常会利用及函数库,函数库分为静态库和动态库两种植。和多数丁所熟识的动态语言及静态语言同样,这里的所谓静态和动态是对立编译期和运行期的:静态库在程序编译时见面被链接到目标代码中,程序运行时用不再需要改静态库;而动态库在次编译时连无见面吃链接到目标代码中,只是当程序运行时才给载入,因为以程序运行期间还需要动态库的在。

  iPhone官方只支持静态库联编。

深深了解framework(框架,其实一定给静态框架,不是动态库)

打包framework还是一个于重要的效力,可以据此来举行一下事务:

(1)封装功能模块,比如有比成熟之功能模块封装成一个管,然后下好还是外同事用起比便宜。

(2)封装项目,有时候会碰到是状况,就是一律小合作社找了点儿个出企业做简单单种类,然后要求她们之种被的一个嵌套进任何一个种类,此时啊堪把呗嵌套的型自从包改成framework放上,这样比较有利。

 

咱俩为何用框架(Framework)?

倘若惦记用同一栽开发者友好之道共享库是老大麻烦的。你非但要包含库本身,还要进入所有的条文件,资源等等。

苹果解决此问题的办法是框架(framework)。基本上,这是富含一定结构并含有了援该库时所必需的享有东西的文本夹。不幸的是,iOS禁止所有的动态库。同时,苹果为起Xcode中移除了创办静态iOS框架的功能。

Xcode仍然可以支持创造框架的功效,重开这个职能,我们得对Xcode做有微小改变。

管代码封装于静态框架是为app
store所允许的。尽管形式各异,本质上其仍然是平等种静态库。

框架(Framework)的类别

大多数框架都是动态链接库的款式。因为只有苹果才会以iOS设备上安装动态库,所以我们无能为力缔造这种类型的框架。

静态链接库和动态库一样,只不过它是当编译时链接二前进制代码,因此用静态库不见面出动态库那样的题材(即除苹果谁为无可知以iOS上采取动态库)。

“伪”框架是通过破解Xcode的目标Bundle(使用一些脚本)来贯彻之。它在表面上以及以时以及静态框架并凭别。“伪”框架项目之效力几乎和诚的框架项目并未分(不是全方位)。

“嵌入”框架是静态框架的一个装进,以便Xcode能博取框架内的资源(图片、plist、nib等)。

此次公布包括了创建静态框架和“伪”框架的沙盘,以及双边的“嵌入”框架。

所以啊一样种植模板?

此次公布有些许单模板,每个模板都发“强”“弱”两独品类。你得选最好可一栽(或者简单种植都设置及)。

最酷的不同是Xcode不克缔造“真”框架,除非您安装静态框架文件xcspec在Xcode中。这确是一个缺憾(这个文件是吃品种采取的,而非是框架而用的)。

简单第

粗略说,你可如此决定就此啊一样种植模板:

只要你莫思量修改Xcode,那么请用“伪”框架版本

设若您只是怀念共享二进制(不是路),两栽都足以

假定您想管框架共享于莫思修改Xcode的开发者,使用“伪”框架版本

比方你想管框架共享于改了Xcode的开发者,使用“真”框架版本

设您想把框架项目作为其他一个品种之借助(通过workspace或者子项目的法),请动“真”框架(或者“伪”框架,使用-framework——见后)

如果你想以公的框架项目受到参加其他静态库/框架,并将它也链接到最终结出以便不需独自添加到用户项目遭到,使用“伪”框架

“伪”框架

“伪”框架是破解的“reloacatable object file”(可重定位格式的靶子文件,
保存在代码和多少,适合吃跟任何的靶子文件连续至联合,用来创造一个而尽对象文件要是一个只是共享目标文件),它好吃Xcode编译出类似框架的东西——其实呢是一个bundle。

“伪框架”模板把全副过程分成几单步骤,用一点脚论去来一个委的静态框架(基于静态库而不是reloacatable
object
file)。而且,框架项目或拿其定义为wrapper.cfbundle类型,一种植Xcode中之“二等公民”。

为此其与“真”静态框架一样好健康办事,但当是因关系经常就出劳动了。

拄问题

使未以依赖,只是创建普通的路是尚未其他问题的。但是只要下了档次依赖(比如以workspace中),Xcode就悲剧了。当你点击“Link
Binary With
Libraries”下方的’+’按钮时,“伪框架”无法展示在列表中。你可由君的“伪”框架项目的Products下面用它手动拖入,但当您编而的主项目时,会油然而生警示:

warning: skipping file ‘/somewhere/MyFramework.framework’
(unexpectedfile type ‘wrapper.cfbundle’ in Frameworks & Libraries build
phase)

并陪“伪”框架中的链接错误。

万幸的是,有个艺术来缓解其。你可以以”Other Linker
Flags”中用”-framwork”开关手动告诉linker去使用你的框架进行链接:

-framework MyFramework

提个醒仍然是,但起码能够正确链接了。

补偿加另的库/框架

假若您进入另外静态(不是动态)库/框架到你的“伪”框架项目面临,它们以“链接”进你说到底的二进制框架文件中。在“真”框架项目中,它们是纯粹引用,而未是链接。

而可以在类型受到只是包含头文件要无是静态库/框架本身的点子避免这种情况(以便编译通过)。

“真”框架

“真”框架各个方面都合乎“真”的正式。它是实在的静态框架,正而以苹果于自Xcode中删除的老功能所创造的一模一样。

为了能创真正的静态框架项目,你必需在Xcode中装置一个xcspec文件。

假使你发表一个“真”框架项目(而无是编译),希望去编译这个框架的口少不了也设置xcspec文件(使用本次发布的设置脚本),以便Xcode能掌握目标项目。

专注:如果你在发布了编译的框架,而无是框架项目,最终用户并不需要安装任何事物。

自曾交由一个告诉让苹果,希望她们于Xcode中更新是文件,但那要或多或少时间.OpenRadarlink
here

加以其它静态库/框架

假如您在另外静态(不是动态)库/框架到你的“真”框架项目,它们不过会为引述,而未会象“伪”框架一样叫链接到最终的二进制文件被。

从前期版本升级

如您是打Mk6要又早的版升级,同时使“真”静态框架,并且使Xcode4.2.1以前的本,请运行uninstall_legacy.sh因卸载早期用于Xcode的具有修正。然后还运行install.sh,重开Xcode。如果你下Xcode4.3以后,只待周转install.sh并重启Xcode。

安装

各自运行Real Framework目录或Fake
Framework目录下的install.sh脚本进行设置(或者少独你还运行)。

重启Xcode,你以在初类型引的Framework&Library下看到StaticiOS
Framework(或者Fake Static iOS Framework)。

卸载请运行unistall.sh脚本并重启Xcode。

创立一个iOS框架项目

开创新品类。

种项目选择Framework&Library下的Static iOS Framework(或者Fake Static
iOS Framework)。

选择“包含单元测试”(可选的)。

以target中加入类、资源相当。

凡其他品类只要运用的条文件,必需声明也public。进入target的Build
Phases页,展开Copy
Headers项,把需要public的条文件由Project或Private部分拖拽到Public部分。

编译你的 iOS 框架

择指定target的scheme

改scheme的Run配置(可选)。Run配置默认使用Debug,但每当备选安排的时候你也许想利用Release。

编译框架(无论目标为iOS
device和Simulator都见面编译出同之二进制,因此挑选谁还不在乎了)。

打Products下选中您的framework,“show in Finder”。

在build目录下起半点个文本夹:(yourframework).framework and (your
framework).embeddedframework.

一经你的框架只有代码,没有资源(比如图片、脚本、xib、coredata的momd文件等),你得管(yourframework).framework 分发给你的用户就是推行了。如果还包含有资源,你必需分发(your
framework).embeddedframework
被你的用户。

为何要embedded
framework?因为Xcode不会见招来静态框架中之资源,如果您分发(your
framework).framework, 则框架中之所有资源还不见面来得,也非可用。

一个embedded
framework只是一个framework之外的叠加的保,包括了是框架的有所资源的号链接。这样做的目的是被Xcode能够找到这些资源。

使用iOS 框架

iOS框架和例行的Mac OS动态框架差不多,只是她是静态链接的而已。

每当公的花色遭到使用一个框架,只待将它们拖就你的类蒙。在含蓄头文件时,记住使用尖括号要不是双料勾号括住框架名称。例如,对于框架MyFramework:

#import <MyFramework/MyClass.h>

利用问题

Headers Not Found

而Xcode找不交框架的腔文件,你或是忘记将它们声明也public了。参考“创建一个iOS框架项目”第5步。

No Such Product Type

如果你没安装iOS Universal
Framework在Xcode,并图编译一个universal框架项目(对于“真”框架,不是“假”框架),这会促成下列错误:

target specifies product type
‘com.apple.product-type.framework.static’,but there’s no such product
type for the ‘iphonesimulator’ platform

为编译“真”iOS静态框架,Xcode需要开片移,因此为了编译“真”静态框架项目,请于装有的支出环境被设置她(对于以框架的用户不需要,只有使造译框架才用)。

The selected run destination is not valid for this action

有时候,Xcode出错并加载了左的active设置。首先,请尝试还开Xcode。如果不当继续在,Xcode产生了一个格外的路(因为Xcode4的一个bug,任何类型的档次都见面现出是题材)。如果是这般,你待创造一个新路还来平等全。

链接警告

先是糟编译框架target时,Xcdoe会在链接阶段报告找不顶文件夹:

ld: warning: directory not found for
option’-L/Users/myself/Library/Developer/Xcode/DerivedData/MyFramework-ccahfoccjqiognaqraesrxdyqcne/Build/Products/Debug-iphoneos’

这时候,可以clean并还编译target,警告会消除。

Core Data momd not found

于框架项目以及应用程序项目,Xcode会以不同的点子编译momd(托管对象模型文件)。Xcode会简单地以彻底目录创建.mom文件,而非见面创一个.momd目(目录中富含VersionInfo.plist和.mom文件)。

即表示,当由一个embedded
framework的model中实例化NSManagedObjectModel时,你必需使用.mom扩展名当model的URL,而不是采用.momd扩展名。

NSURL *modelURL = [[NSBundle mainBundle]URLForResource:@”MyModel”
withExtension:@”mom”];

Unknown class MyClass in Interface Builder file.

鉴于静态框架下静态链接,linker会剔除所有它当没用的代码。不幸的凡,linker不会检查xib文件,因此若类似是在xib中引用,而从未于O-C代码中援引,linker将于最终之可执行文件中删除类。这是linker的题材,不是框架的题目(当你编译一个静态库时也会有这个题目)。苹果内置框架不会见来此题材,因为他俩是运作时动态加载的,存在让iOS设备固件中之动态库是未容许吃删除的。

发出零星单缓解的艺术:

     让框架的最终用户关闭linker的优化增选,通过当他们的类型之Other
Linker Flags中添加-ObjC和-all_load。

   
 在框架的其它一个接近吃加以一个此类的代码引用。例如,假要你来个MyTextField类,被linker剔除了。假设你还有一个MyViewController,它以xib中使了MyTextField,MyViewController并从未叫删去。你应有这样做:

在MyTextField中:

+ (void)forceLinkerLoad_ {}

在MyViewController中:

+(void) initialize {     [MyTextField forceLinkerLoad_]; }

她俩仍需要添加-ObjC到linker设置,但未需强制all_load了。

第2栽方式要你多举行一些行事,但可让最终用户避免在动用你的框架时关闭linker优化(关闭linker优化会招致object文件膨胀)。

unexpected file type ‘wrapper.cfbundle’ in Frameworks &Libraries build
phase

这个题材产生在管“假”框架项目作workspace的仗,或者把它当作子项目时(“真”框架项目并未此问题)。尽管这种框架项目起了无可非议的静态框架,但Xcode只能由品种文件被看到这是一个bundle,因此它在自我批评乘时生一个警戒,并当linker阶段跳了它们。

卿可以手动添加一个发令于linker在链接阶段能够是链接。在乘而的静态框架的色之OtherLinker
Flags中在:

-framework MyFramework

警戒仍然有, 但不会见招链接失败。

Libraries being linked or not being linked into the finalframework

老倒霉, “真”框架和“假”框架模板在拍卖引入的静态库/框架的做事办法不同的。

“真”框架模板下常规的静态库生成步骤,不见面链接其他静态库/框架到终极生产物中。

“假”框架模板下“欺骗”Xcode的手腕,让其认为是以编译一个可再次一贯格式的靶子文件,在链接阶段就似编译一个可执行文件,把装有的静态代码文件链接到最终生成物中(尽管未会见检查是不是真目标代码)。为了实现象“真”框架一样的成效,你得独自保证含库/框架的峰文件及你的品类面临,而不需包含库/框架本身。

Unrecognized selector in (some class with a category method)

倘您的静态库或静态框架包含了一个模块(只以档次代码中扬言,没有接近实现),linker会搞不清楚,并将代码从二进制文件被除去。因为以结尾生成的文件被莫这法,所以当调用这个项目吃定义之计时,会报一个“unrecognizedselector”异常。

假使化解之,在富含这个路的模块代码中加一个“假的”类。linker发现有完整的O-C类,会将品种代码链接到模块。

自家勾勒了一个峰文件 LoadableCategory.h,以减轻这个工作量:

#import “SomeConcreteClass+MyAdditions.h”

#import
“LoadableCategory.h”  MAKE_CATEGORIES_LOADABLE(SomeConcreteClass_MyAdditions);  
@implementation SomeConcreteClass(MyAdditions)

  … 

@end

以行使这个框架时,仍然还索要在Build Setting的Other Linker
Flags中在-ObjC。

推行另外代码前单元测试崩溃

若果你以Xcode4.3中创造静态框架(或库)target时,勾选了“withunit
tests”,当你待运行单元测试时,它会倒:

Thread 1: EXC_BAD_ACCESS (code=2, address=0x0) 0 0x00000000 — 15
dyldbootstrap:start(…)

随即是lldb中的一个bug。你可就此GDB来运转单元测试。编辑scheme,选择Test,在Info标签中将调试器Debugger从LLDB改吧GDB。

摘自:http://blog.csdn.net/stackhero/article/details/9032999

相关文章