Objective-C 基础教程第六章,源文件组织
Object-C 基础教程第六章,源文件组织
0x00:前言
到目前为止,我们讨论过的所有项目都是把源代码统统放入到了main.m文件中。这样随着项目越来越大,文件内容会越来越多,到后面我们的项目就不太好管理,因为所有东西都写在一起搜索起来也比较费劲。
现在我们需要学习Xcode用类文件的方式来区分.h .m将类,单独分类成文件的形式。
0x01:Xcode创建OC类
因为书中的例子已经非常老了不再适用,我这里用最新的Xcode13来演示之前的Car程序。

选择CocoClass

输入类名,并且选择继承自NSObject

接着我们就创建好了我们的Engine类,然后我们把main.m中的Engine类代码给移植过去。

接着你们可以重复如上的操作,将其他类也创建成类文件,并且将代码移植过去最后如下图。
这样代码结构就清晰多了,而且后续要添加修改代码,就在指定的类文件中修改即可。

0x02:Xcode群组
Xcode群组有两种,一种是会创建文件夹,将你的文件移动到文件夹里。还有一种是不会创建文件夹,只是在Xcode中看起来比较结构清晰 理论上的群组。

并没有创建文件夹。

这样文件管理,代码结构上看着就又更加舒服 清晰了。

0x03 Xcode跨文件依赖关系
依赖关系(dependency)是两个实体之间的一种关系。
在编程和开发过程中,经常会出现关于依赖关系的问题,比如Slant6类因继承了Engine类,那么当Engine类发生了变化,比如添加了新的实例变量,那么Slant6就依赖于Engine类,并且需要才行编译Slant6来适应这个变化,那么这里就有一个问题,假如我们有超级多的.m文件用了这个Engine头文件,那么岂不是得花超长时间来编译?
@class关键字
为了解决如上的问题,好在Objective-C引入了关键字@class用来告诉编译器,这是一个类,所以我只会通过指针来引用他,这样编译器就不需要知道.h类文件中的所有成员和方法了,节省了不少时间。ps:那么请猜测或者动手实践一下,加入我们逆向分析的时候还能导出对应的类头文件吗?或者对应头文件中他还会显示类型吗?。
#import <Foundation/Foundation.h>
@class Tire; //修改成@class方式 引入类指针。
@class Engine;
//#import "Engine.h" //将这里注释了
//#import "Tire.h"
NS_ASSUME_NONNULL_BEGIN
/*
汽车
*/
@interface Car : NSObject
{
Engine *engine;
Tire *tires[4];
}
-(Engine *)engine;
-(void) setEngine:(Engine *) newEngine;
-(Tire*) tireAtIndex:(int) index;
-(void) setTire:(Tire*) tire atIndex:(int) index;
-(void) print;
@end
NS_ASSUME_NONNULL_END
神奇,我们修改后还是可以编译,使得程序正常运行。

说明:@class创建了一个前向引用。这是在告诉编译器:"相信我。以后你自然会知道这个类到底是什么,但是现在,你知道这些足矣。"
导入和继承
当我们想在子类里面也用上面这种方式就不行了,因为被继承的类他需要确切的知道父类中的详细数据,比如方法比如属性,这样你才能继承他,这样你才能重写他的方法。

小结
在本章中,我们学习了使用多个文件来组织我们的源代码的基本技巧。这样使得我们看代码更加轻松,而且方便管理。
我们还学习了@class关键字的依赖关系,使得我们在编译文件时,可以让其时间变短,这得益于@class这关键字。
Objective-C 基础教程第六章,源文件组织的更多相关文章
- Objective-C 基础教程第七章,深入理解Xcode
目录 Object-C 基础教程第七章,深入理解Xcode 0x00 前言 0x01 创建工程界面 0x02 主程序界面 ①顶部 Top Test(测试) Profile(动态分析) Analyze( ...
- Objective-C 基础教程第三章,面向对象编程基础知
目录 Objective-C 基础教程第三章,面向对象编程基础知 0x00 前言 0x01 间接(indirection) 0x02 面向对象编程中使用间接 面向过程编程 面向对象编程 0x03 OC ...
- Objective-C 基础教程第五章,复合
目录 Objective-C 基础教程第五章,复合 什么是复合? Car程序 自定义NSLog() 存取方法get Set Tires(轮胎) 存取方法 Car类代码的其他变化 扩展Car程序 复合还 ...
- [ABP教程]第六章 作者:领域层
Web开发教程6 作者:领域层 关于此教程 在这个教程系列中,你将要构建一个基于ABP框架的应用程序 Acme.BookStore.这个应用程序被用于甘丽图书页面机器作者.它将用以下开发技术: Ent ...
- css3基础教程十六变形与动画animation
前面我们讲过的变形与动画一般都是通过鼠标的单击.获得焦点,被点击或对元素进行一定改变后以后触发效果的,那么有没有像Flash一样自动播放的动画效果呢?答案当然是肯定的,这就是我们今天要讲到的anima ...
- Python机器学习基础教程-第2章-监督学习之决策树
前言 本系列教程基本就是摘抄<Python机器学习基础教程>中的例子内容. 为了便于跟踪和学习,本系列教程在Github上提供了jupyter notebook 版本: Github仓库: ...
- Python机器学习基础教程-第2章-监督学习之线性模型
前言 本系列教程基本就是摘抄<Python机器学习基础教程>中的例子内容. 为了便于跟踪和学习,本系列教程在Github上提供了jupyter notebook 版本: Github仓库: ...
- Python机器学习基础教程-第2章-监督学习之K近邻
前言 本系列教程基本就是摘抄<Python机器学习基础教程>中的例子内容. 为了便于跟踪和学习,本系列教程在Github上提供了jupyter notebook 版本: Github仓库: ...
- Python机器学习基础教程-第1章-鸢尾花的例子KNN
前言 本系列教程基本就是摘抄<Python机器学习基础教程>中的例子内容. 为了便于跟踪和学习,本系列教程在Github上提供了jupyter notebook 版本: Github仓库: ...
随机推荐
- 字节Android Native Crash治理之Memory Corruption工具原理与实践
作者:字节跳动终端技术--庞翔宇 内容摘要 MemCorruption工具是字节跳动AppHealth (Client Infrastructure - AppHealth) 团队开发的一款用于定 ...
- hive DML 操作
数据导入 向表中装载数据(Load) 1.语法 load data [local] inpath '数据的 path' [overwrite] into table student [partitio ...
- JDBC 操作预编译语句中LIKE模糊匹配怎么用
问题描述 在使用JDBC 预编译执行语句时,遇到一个问题,那就是在含有LIKE的查询语句时,我到底怎么使用匹配符%._呢. 如: SELECT * FROM "+LQ_USERS+" ...
- eclipse中快捷键中逗号是怎么用的,如ctrl+2,L
Ctrl +2 同时按下,松开后,再按下L
- listview界面显示
1.布局写listview 2.找到listview 3.封装新闻数据到list集合中 ,目的是为adapter提供数据展示. 4.封装一个Adapter类继承B ...
- 深入epoll
转载请注明来源:https://www.cnblogs.com/hookjc/ 一. 介绍Epoll 是一种高效的管理socket的模型,相对于select和poll来说具有更高的效率和易用性.传统的 ...
- 一致性协议之ZAB
前言 一致性协议 包括 Paxos,Raft,2PC,3PC等等,今天我们讲一种协议,ZAB 协议,该协议应该是所有一致性协议中生产环境中应用最多的了.为什么呢?因为他是为 Zookeeper 设计的 ...
- [源码解析] 模型并行分布式训练 Megatron (4) --- 如何设置各种并行
[源码解析] 模型并行分布式训练 Megatron (4) --- 如何设置各种并行 目录 [源码解析] 模型并行分布式训练 Megatron (4) --- 如何设置各种并行 0x00 摘要 0x0 ...
- MySql索引分析及查询优化
B-Tree 核心特点: 多路,非二叉树 每个节点既保存索引,又保存数据 搜索时相当于二分查找 B+Tree 核心特点 多路非二叉 只有叶子节点保存数据 搜索时相当于二分查找 增加了相邻接点的指向指针 ...
- 【Linux/Oracle】ORA-00031:标记要终止的会话 解决
在PL/SQL操作了一条delete语句用于删除这张1.4亿条数据的表,执行了12个小时还没删完 (经DB指导,量级大的需要使用truncate table table_name 进行删除) --查询 ...