在iOS开发中使用静态库(Static Library)

简介: 引言:静态库是一个(.a)为后缀的文件,它由Xcode编译生成.并且,库中只能存放代码,如果编译静态库的工程中有其他资源是无法一起编译到静态库中.静态库有点类似Windows中的Dll文件.

引言:

静态库是一个(.a)为后缀的文件,它由Xcode编译生成.并且,库中只能存放代码,如果编译静态库的工程中有其他资源是无法一起编译到静态库中.
静态库有点类似Windows中的Dll文件.做过Windows桌面应用的人应该很熟悉.静态库出现的主要目的是为了让代码可以在多个地方重用.
此篇主要记录在iOS中使用静态库时遇到的问题汇总和解决方案.




如何创建一个静态库:




1:主工程关联静态库具体步骤

一:让静态库与项目工程关联起来


二:让项目工程写书写代码时,能够得带静态库中的头文件提示


三:为保证在修改静态库中的代码编译运行后能够每次都取用最新的静态库而进行如下设置(非必要设置)


Full Path 需要选择 DerivedData 文件夹里面 具体编译后所生成的 静态库文件,这样可以保证每次都使用最新的静态库文件 


四:Library Target -> Build Settings -> Build Active Architecture Only

此项在Debug 和Release 模式下 需要设置 为 NO  否则会出现 在使用库里面的类文件时  找不到的错误警告


二:解决静态库无法使用资源文件的方式:

首先,所有的资源文件都依旧依附在静态库中,然后对需要使用的工程传入资源文件的引用即可.

将需要使用的资源文件拖动到工程中以后出现如下图中的设置选项:


三:静态库使用其他静态库的资源时,可直接设置 Header Search Path 即可,前提保证主工程都引用了这些静态库

四:解决在静态库中 使用  Category(类别)  产生的Crash 

在调用静态库的主工程中进行如下设置即可解决问题:

Project->Build Settings->Other Linker Flags   添加值:  -all_load

注:这种设置方法会让所有与主工程有关的静态库和框架都加载其中的Category.

如图:


参考文章:

http://blog.csdn.net/leonpengweicn/article/details/6799994

Category 的使用参考:

http://blog.csdn.net/sanpintian/article/details/7406180

http://www.54xue.com/w/70/n-30670.html

如果要在类别中保存变量,可以参考以下文章:

http://www.cnblogs.com/liping13599168/archive/2012/09/13/2682664.html


解决讯飞语音框架导入后产生编译不通过的解决方案:(将静态库单一设置其加载Category).

参考帖子:

http://dev.voicecloud.cn/bbs/forum.php?mod=viewthread&tid=4154&extra=&page=1

1.去掉-ObjC -all_load参数(这个参数会强制所有的静态链接库都加载其中的category);
2.改为逐一加载Three20的各个静态库,即修改链接参数(Other Linker Flag)为如下形式:
-force_load $(BUILT_PRODUCTS_DIR)/libThree20.a 

如下图:




五:如果你将整个文件切换到了其他目录后,XCode编译时可能产生目录找不到的警告,如下图:


解决方法如下:

确定 Library Search Paths 的路径是否指向正确:


六: Unknown class MyClass in Interface Builder file. 的解决办法

设置 Other Linker Flag-all_load 

在使用静态库时,如果没有设置-all_load . 那么主工程在编译时是不会检测是否引用应该引用的框架(framework).

但是使用是没问题的,但是遇到需要框架才能执行的代码会崩溃,另外xib也会报出 找不到相应的类,除非在代码中主动调用.

七:静态库中的资源使用和管理的最佳解决方案.

使用Bundle捆绑包的方式来使用和管理资源.

步骤如下:

1:新建一个文件夹,将其命名为xxx.bundle. 以后  Mac自定识别到并标识为捆绑包.


2:将静态库使用的相关资源拷贝的bundle里面.


3:抒写代码的时候在路径方面有所改变,如下:

[UIImage imageNamed:@"PullTableView.bundle/arrowhead_up.png"]

4:这一点是我的建议,将捆绑包还是放在静态库的目录里. 然后在拖动到主工程中时,不要选择复制到执行区域.如下图设置即可:




八:当一个项目里面有两个Target都需要使用同一个静态库时,应该这样操作才可以正常使用:


因为在Frameworks里面只会生成一个.a 文件. 所以直接在Target Membership直接勾选即可. 




目录
相关文章
|
25天前
|
API 数据安全/隐私保护 iOS开发
利用uni-app 开发的iOS app 发布到App Store全流程
利用uni-app 开发的iOS app 发布到App Store全流程
81 3
|
3月前
|
存储 iOS开发
iOS 开发,如何进行应用的本地化(Localization)?
iOS 开发,如何进行应用的本地化(Localization)?
122 2
|
3月前
|
存储 数据建模 数据库
IOS开发数据存储:什么是 UserDefaults?有哪些替代方案?
IOS开发数据存储:什么是 UserDefaults?有哪些替代方案?
38 0
|
3月前
|
API 定位技术 iOS开发
IOS开发基础知识:什么是 Cocoa Touch?它在 iOS 开发中的作用是什么?
IOS开发基础知识:什么是 Cocoa Touch?它在 iOS 开发中的作用是什么?
42 2
|
3月前
|
安全 编译器 Swift
IOS开发基础知识: 对比 Swift 和 Objective-C 的优缺点。
IOS开发基础知识: 对比 Swift 和 Objective-C 的优缺点。
89 2
|
2月前
|
监控 API Swift
用Swift开发iOS平台上的上网行为管理监控软件
在当今数字化时代,随着智能手机的普及,人们对于网络的依赖日益增加。然而,对于一些特定场景,如家庭、学校或者企业,对于iOS设备上的网络行为进行管理和监控显得尤为重要。为了满足这一需求,我们可以利用Swift语言开发一款iOS平台上的上网行为管理监控软件。
181 2
|
3月前
|
数据可视化 iOS开发
iOS 开发,什么是 Interface Builder(IB)?如何使用 IB 构建用户界面?
iOS 开发,什么是 Interface Builder(IB)?如何使用 IB 构建用户界面?
40 4
|
3月前
|
iOS开发
iOS开发解释 App 生命周期,包括各个阶段的调用顺序。
iOS开发解释 App 生命周期,包括各个阶段的调用顺序。
26 1
|
3月前
|
存储 安全 数据安全/隐私保护
IOS开发数据存储:解释一下 iOS 中的 Keychain,它的作用是什么?
IOS开发数据存储:解释一下 iOS 中的 Keychain,它的作用是什么?
83 4
|
3月前
|
存储 数据库 iOS开发
IOS开发数据存储:什么是 CoreData?如何在应用中使用它?
IOS开发数据存储:什么是 CoreData?如何在应用中使用它?
34 0