IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> 5、全局符号的理解 -> 正文阅读

[移动开发]5、全局符号的理解

  • 我们通过一个案例来理解全局符号的概念
    • 创建一个Framework项目名称为HSOneFramework、声明一个头文件HSOneFramework.h
#import <HSOneFramework/HSOneObject.h>
  • 创建一个HSOneObject类
@interface HSOneObject : NSObject
- (void)testOneObject;
@end
@implementation HSOneObject
void global_object(){
    NSLog(@"HSOneObject -- global_object");
}
- (void)testOneObject{
    NSLog(@"HSOneObject -- testOneObject");
}
@end
  • 再创建个iOS--App Demo
  • 打开HSGlobSymbol Demo、将项目中文件都收缩后、点左下角点击添加 Files
    在这里插入图片描述
  • 然后 Copy Items…、点击Options、选中刚才创建的 HSOneFrameworkxcodeproj项目—> Add
    在这里插入图片描述
  • 发现会添加成这个样子
    在这里插入图片描述
  • 在当前Xcode操作环境下—>
  • 点击电脑左上角File—>
  • Save as Workspace —>
  • 编辑新的名称为 MultiProject.xcworkspace。
  • 关闭当前项目。打开刚才创建的MultiProject.xcworkspace。两个合并的项目展现。打开后目录如下
    在这里插入图片描述
  • 下面我们在HSGlobSymbolTarget处添加framework
    在这里插入图片描述
    在这里插入图片描述
  • 选择HSOneFramework.framework,并且设置EmbedEmbed & Sign
  • 此时此刻、我们在HSGlobSymbol引入 刚才的framework中头文件、会发现文件找不到的报错问题。
    在这里插入图片描述
  • 点开 HSOneFramework --> HSOneObject.h文件、查看文件属性。
    在这里插入图片描述
  • 将文件访问控制权限改为 Public 即可。
  • 多个项目合并为一个的时候、使用的workspace的作用是什么呢?
    • 可重用性。多个模块可以在多个项目中使用。节约开发和维护时间。
    • 节省测试时间。单独模块意味着每个模块都可以添加测试功能。
    • 更好的理解模块化思想。
  • 下面我们开始查看这个项目
    • 在动态库的 HSOneObject.m中我们实现了全局符号的函数、但是在.h中并没有进行声明。
void global_object(){
    NSLog(@"HSOneObject -- global_object");
}
  • 这个时候我们在ViewController中声明下这个全局符号。并且进行函数调用。
void global_object(void);
- (void)viewDidLoad {
    [super viewDidLoad];
    global_object();
}
  • 此时编译正常通过、输出结果为我们在HSOneObject.m中的实现日志
HSOneObject -- global_object
  • 由此可见、全局符号对我们整个项目是可见的、对使用的人是可见的。
  • 此时此刻、我们对 global_object 进行 static修饰。那就意味着它会变成本地符号,只能在定义的当前文件可用。
  • 与此同时、我们在ViewControler再次对global_object全局函数进行实现。那么会发生什么呢?
void global_object(void);
- (void)viewDidLoad {
    [super viewDidLoad];
    global_object();	//ViewController -- global_object
    HSOneObject *one = [[HSOneObject alloc]init];
    [one testOneObject];
}
void global_object(){
    NSLog(@"ViewController -- global_object");
}
  • 运行正常、并且当前输出结果为控制器的日志。这是为什么呢?
  • 在链接过程中、有一个二级命名空间的概念。
  • 二级命名空间一级命名空间 (two_levelnamespace & flat_namespace:)
  • 链接器默认采用二级命名空间,也就是除了会记录符号名称,还会记录符号属于哪个Mach-O,比如会记录下来 _NSLog来自Foundation
  • 上述全局函数在调用时、有两个Mach-O文件记录了它的实现部分,HSOneFrameworkHSGlobSymbol、根据二级命名空间原则,优先调用当前的Mach-O,他们不会产生冲突。
  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-09-09 11:53:22  更:2021-09-09 11:55:51 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 17:05:30-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码