在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直接勾选即可. 




目录
相关文章
|
4天前
|
iOS开发 开发者
uniapp开发ios打包Error code = -5000 Error message: Error: certificate file(p12) import failed!报错问题如何解决
uniapp开发ios打包Error code = -5000 Error message: Error: certificate file(p12) import failed!报错问题如何解决
uniapp开发ios打包Error code = -5000 Error message: Error: certificate file(p12) import failed!报错问题如何解决
|
28天前
|
iOS开发 开发者 MacOS
深入探索iOS开发中的SwiftUI框架
【10月更文挑战第21天】 本文将带领读者深入了解Apple最新推出的SwiftUI框架,这一革命性的用户界面构建工具为iOS开发者提供了一种声明式、高效且直观的方式来创建复杂的用户界面。通过分析SwiftUI的核心概念、主要特性以及在实际项目中的应用示例,我们将展示如何利用SwiftUI简化UI代码,提高开发效率,并保持应用程序的高性能和响应性。无论你是iOS开发的新手还是有经验的开发者,本文都将为你提供宝贵的见解和实用的指导。
121 66
|
14天前
|
存储 监控 API
app开发之安卓Android+苹果ios打包所有权限对应解释列表【长期更新】-以及默认打包自动添加权限列表和简化后的基本打包权限列表以uniapp为例-优雅草央千澈
app开发之安卓Android+苹果ios打包所有权限对应解释列表【长期更新】-以及默认打包自动添加权限列表和简化后的基本打包权限列表以uniapp为例-优雅草央千澈
|
1月前
|
开发框架 Android开发 iOS开发
安卓与iOS开发中的跨平台策略:一次编码,多平台部署
在移动应用开发的广阔天地中,安卓和iOS两大阵营各占一方。随着技术的发展,跨平台开发框架应运而生,它们承诺着“一次编码,到处运行”的便捷。本文将深入探讨跨平台开发的现状、挑战以及未来趋势,同时通过代码示例揭示跨平台工具的实际运用。
123 3
|
1月前
|
Java 调度 Android开发
安卓与iOS开发中的线程管理差异解析
在移动应用开发的广阔天地中,安卓和iOS两大平台各自拥有独特的魅力。如同东西方文化的差异,它们在处理多线程任务时也展现出不同的哲学。本文将带你穿梭于这两个平台之间,比较它们在线程管理上的核心理念、实现方式及性能考量,助你成为跨平台的编程高手。
|
2月前
|
存储 前端开发 Swift
探索iOS开发:从新手到专家的旅程
本文将带您领略iOS开发的奇妙之旅,从基础概念的理解到高级技巧的掌握,逐步深入iOS的世界。文章不仅分享技术知识,还鼓励读者在编程之路上保持好奇心和创新精神,实现个人成长与技术突破。
|
2月前
|
安全 IDE Swift
探索iOS开发之旅:从初学者到专家
在这篇文章中,我们将一起踏上iOS开发的旅程,从基础概念的理解到深入掌握核心技术。无论你是编程新手还是希望提升技能的开发者,这里都有你需要的指南和启示。我们将通过实际案例和代码示例,展示如何构建一个功能齐全的iOS应用。准备好了吗?让我们一起开始吧!
|
物联网 Android开发 iOS开发
iOS开发 - 蓝牙学习的总结
iOS开发 - 蓝牙学习的总结
199 0
|
iOS开发
IOS开发---菜鸟学习之路--(九)-利用PullingRefreshTableView实现下拉刷新
本章主要讲解如何利用PullingRefreshTableView实现下拉(上拉)刷新的操作  PullingRefreshTableView 实现上下拉刷新的例子百度有很多,大家可以自己搜索下,先看下那些例子(一般搜索过来的都是一样的大家反正先把那部分内容先了解一下,然后再看本文档比较好。
895 0
|
iOS开发 Android开发 存储
IOS开发---菜鸟学习之路--(十)-实现新闻详细信息浏览页面
前面已经将了上下拉刷新 实现了上下拉刷新后我们的第一级界面就做好,接下来我们就需要实现 新闻详细信息浏览了 我个人认为一般实现新闻详细页面的方法有两种(主要是数据源的不同导致了方法的不同) 第一种是本身新闻就是一个链接地址,同时是已经处理好的适应手机浏览的网页 对于这种类型的数据源,我们直接在页面中放一个WebView控件,然后将URL传递过去就好了 另一种则是普通的包含标题、时间、内容、图片等数据结构的新闻内容(我们要实现的也是这种新闻,因为实现了这种之后, 我们就可以实现任何自定义的详细信息的页面了。
892 0