iOS研发之静态库的封装

2024-09-05 01:32
文章标签 封装 静态 ios 研发

本文主要是介绍iOS研发之静态库的封装,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、简单介绍

1.什么是库?

  库是程序代码的集合,是共享程序代码的一种方式

 

2.库的分类

  根据源代码的公开情况,库可以分为2种类型

  (1)开源库

    公开源代码,能看到具体实现

    比如SDWebImage、AFNetworking

 

  (2)闭源库

    不公开源代码,是经过编译后的二进制文件,看不到具体实现

    主要分为:静态库、动态库

 

二、静态库和动态库

1.静态库和动态库的存在形式

静态库:.a 和 .framework

动态库:.dylib 和 .framework

 

2.静态库和动态库在使用上的区别

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

动态库:链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序共用,节省内存

      

注意点:项目中如果使用了自制的动态库,不能被上传到AppStore

 

三、静态库的制作(.a)

(1)选择“Cocoa Touch Static Library”


(2)输入静态库名称(以MJRefresh为例)

  

(3)删除自动生成的文件

  

(4)添加库需要包含的源代码

   

  

注意:资源文件是不能打包到.a文件中的。

(5)选择需要暴露出来的.h文件,.m文件会自动编译到.a文件中

  

  添加,并选择需要暴露的头文件

  


设置(移动)为公开的。


(6)选择真机设备,然后 Command+B 编译,libMJRefresh.a文件从红色变为黑色

  这个时候,程序会报错,因为框架中包含了CGFloat,它是UIKit里面的东西,因此可以在pch文件中包含UIKit框架。

  

  再次进行编译,编译成功后生成的.a文件就是静态库。

(7)选择模拟器,依然 Command+B ,模拟器和真机环境下用的.a文件是分开的

  

(8)右击“Show In Finder”,查看制作好的.a文件

     

说明

Debug-iphoneos文件夹里面的东西是用在真机上的

Debug-iphonesimulator文件夹里面的东西是用在模拟器上的 

如果Scheme是Release模式,生成的文件夹就以Release开头

(9)合并两个文件

如果想让一个.a文件能同时用在真机和模拟器上,需要进行合并

在终端输入指令:

  lipo -create Debug-iphoneos/libMJRefresh.aDebug-iphonesimulator/libMJRefresh.a-outputlibMJRefresh.a

说明

蓝色部分是固定指令

红色、紫色是真机和模拟器.a文件的路径

绿色是所合成.a文件的路径

   

  生成的文件(静态库)

      

提示

1)文件大小.a文件的体积(一般情况下)

  真机用的.a > 模拟器用的.a

  所合成.a == 真机用的.a + 模拟器用的.a

2).a的类型

    通过lipo –info libMJRefresh.a可以查看 .a 的类型(模拟器还是真机)

  

(10)如何使用.a

  直接将.a、.h、资源文件拖拽到其他项目中即可

  别人拿到的框架,只有.a文件和暴露出来的头文件

  

注意:如果库中还包含了一些资源文件(如图片等),那么资源文件也应该放在上面的文件夹中。

 

四、制作静态库的注意点

(1)注意

  无论是 .a 静态库还是 .framework 静态库,最终需要的都是:二进制文件 + .h + 其它资源文件

 

(2).a 和 .framework 的使用区别

  .a 本身是一个二进制文件,需要配上 .h 和 其它资源文件 才能使用

  .framework 本身已经包含了 .h 和 其它资源文件,可以直接使用

 

(3)图片资源的处理

  如果静态库中用到了图片资源,一般都放到一个bundle文件中,bundle名字一般跟 .a 或 .framework 名字一致

  bundle的创建:新建一个文件夹,修改扩展名为 .bundle 即可,右击bundle文件,显示包内容,就可以往bundle文件中放东西

  建议:自己制作的静态库中要用到的图片资源,不建议直接以png的后缀名方式拖到项目中使用,而是推荐使用放到bundle文件中。这样可以避免静态库的图片名和使用静态库的项目中存在的图片产生冲突。

  1)新建一个文件夹,把需要打包的资源图片放在里面

    

  2)修改扩展名为 .bundle,敲回车,点击添加。

    

(4)多文件处理

  如果静态库需要暴露出来的 .h 比较多,可以考虑创建一个主头文件(一般 主头文件 和 静态库 同名)

  在主头文件中包含所有其他需要暴露出来的 .h 文件

  使用静态库时,只需要#import 主头文件

  实际上苹果官方就是这么做的,例如:#import <UIKit/UIKit.h>

 

 (5).framework为什么既是静态库又是动态库

  系统的 .framework 是动态库

  我们自己建立的 .framework 是静态库

 

(6)静态库中包含了Category(分类)

如果静态库中包含了Category,有时候在使用静态库的工程中会报“方法找不到”的错误(unrecognized selector sent to instance

解决方案:在使用静态库的工程中配置Other Linker Flags为-ObjC


这篇关于iOS研发之静态库的封装的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1137591

相关文章

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

跨国公司撤出在华研发中心的启示:中国IT产业的挑战与机遇

近日,IBM中国宣布撤出在华的两大研发中心,这一决定在IT行业引发了广泛的讨论和关注。跨国公司在华研发中心的撤出,不仅对众多IT从业者的职业发展带来了直接的冲击,也引发了人们对全球化背景下中国IT产业竞争力和未来发展方向的深思。面对这一突如其来的变化,我们应如何看待跨国公司的决策?中国IT人才又该如何应对?中国IT产业将何去何从?本文将围绕这些问题展开探讨。 跨国公司撤出的背景与

安卓链接正常显示,ios#符被转义%23导致链接访问404

原因分析: url中含有特殊字符 中文未编码 都有可能导致URL转换失败,所以需要对url编码处理  如下: guard let allowUrl = webUrl.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {return} 后面发现当url中有#号时,会被误伤转义为%23,导致链接无法访问

Thymeleaf:生成静态文件及异常处理java.lang.NoClassDefFoundError: ognl/PropertyAccessor

我们需要引入包: <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>sp

【iOS】MVC模式

MVC模式 MVC模式MVC模式demo MVC模式 MVC模式全称为model(模型)view(视图)controller(控制器),他分为三个不同的层分别负责不同的职责。 View:该层用于存放视图,该层中我们可以对页面及控件进行布局。Model:模型一般都拥有很好的可复用性,在该层中,我们可以统一管理一些数据。Controlller:该层充当一个CPU的功能,即该应用程序

JavaSE——封装、继承和多态

1. 封装 1.1 概念      面向对象程序三大特性:封装、继承、多态 。而类和对象阶段,主要研究的就是封装特性。何为封装呢?简单来说就是套壳屏蔽细节 。     比如:对于电脑这样一个复杂的设备,提供给用户的就只是:开关机、通过键盘输入,显示器, USB 插孔等,让用户来和计算机进行交互,完成日常事务。但实际上:电脑真正工作的却是CPU 、显卡、内存等一些硬件元件。

哈希表的封装和位图

文章目录 2 封装2.1 基础框架2.2 迭代器(1)2.3 迭代器(2) 3. 位图3.1 问题引入3.2 左移和右移?3.3 位图的实现3.4 位图的题目3.5 位图的应用 2 封装 2.1 基础框架 文章 有了前面map和set封装的经验,容易写出下面的代码 // UnorderedSet.h#pragma once#include "HashTable.h"

封装MySQL操作时Where条件语句的组织

在对数据库进行封装的过程中,条件语句应该是相对难以处理的,毕竟条件语句太过于多样性。 条件语句大致分为以下几种: 1、单一条件,比如:where id = 1; 2、多个条件,相互间关系统一。比如:where id > 10 and age > 20 and score < 60; 3、多个条件,相互间关系不统一。比如:where (id > 10 OR age > 20) AND sco

C++/《C++为什么要有静态成员函数》

摘要        本文说明了什么是静态成员变量,什么是静态成员函数的概念,讨论了访问私有静态成员变量的三个方法。得出用静态成员函数访问静态私有成员变量是最佳方法即回答了“C++为什么要有静态成员函数“的问题。 类的静态成员 我们可以使用 static 关键字来把类成员定义为静态的。当我们声明类的成员为静态时,这意味着无论创建多少个类的对象,静态成员都只有一个副本。静态成员在类的所有对象中是

c++的静态变化!

静态成员   对于非静态成员,一个类的每个对象都自己存有一个副本,每个对象根据自己拥有的非静态的数据成员来区别于其他对象。而静态成员则解决了同一个类的多个对象之间数据和函数的共享问题。   静态数据成员   静态数据成员的作用是:实现同一类的不同对象之间的数据共享。   #include<IOSTREAM>   using namespace std;   class Po