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学习
近5天没有更新博客,因为这几天略微放下了python的学习,android这边连带项目比较急迫,先花大约1个星期的时间把重心放在Android,但python肯定还会坚持下去,毕竟连着学了那么久了. ...
- linux网卡知识
使用 Vim 文本编辑器来配置网卡设备的绑定参数.网卡绑定的理论知识类似于前面学习的 RAID 硬盘组,我们需要对参与绑定的网卡设备逐个进行"初始设置".需要注意的是,这些原本独立 ...
- linux 环境变量配置方式
linux 环境变量可以在多个文件中配置 说明: linux bash 运行模式分为两种: login shell 和non-login shell, 两种登录模式启动是加载的配置文件不一样. 1. ...
- Python数据结构之“栈”与“队列”
栈(Stacks): ·定义:是一种只能通过访问其一端来实现的数据存储于检索的线性数据结构,具有后进先出(last in first out,LIFO)的特征 ·主要操作: 1. Stack():建立 ...
- 你我都会遇到的需求:如何导出MySQL中的数据~ 简单!实用!
目录 你我都有的需求 方式一:tee 方式二:mysql_use_result 推荐阅读 一.给研发同学看的面试指南 二.MySQL-视频 三.进阶MySQL中间件-视频 四.白日梦的云原生-笔记 五 ...
- 「YNOI2016」自己的发明
「YNOI2016」自己的发明 不换根 基本的莫队吧... 子树直接转到dfs序上. 其余部分可以见 「SNOI2017」一个简单的询问. 换根 根root,查询x,分3种: root不在x子树内,按 ...
- ==和equeals区别以及使用场景
定义 ==:基本数据类型比较的是值或地址,引用数据类型比较的是地址. equals:在不重写的情况下,和==没有任何区别,重写,可以自定义比较规则,一般重写之后都让其比较值. Object类中的equ ...
- ARP协议工作原理
转载请注明来源:https://www.cnblogs.com/hookjc/ ARP数据包根据接收对象不同,可分为两种: 1. 广播包(Broadcast).广播包目的MAC地址为FF-FF- ...
- Docker的数据管理(上)
Docker的数据管理(上) 1.管理docker容器中数据 2.容器互联(使用centos镜像) 1.管理docker容器中数据: 管理Docker 容器中数据主要有两种方式:数据卷(Data Vo ...
- uos系统离线状态下进入开发者模式
需到处机器信息,接着登入指定的uos开发者网站,下载证书,然后在机器上加载证书,重启即可.