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 基础教程第六章,源文件组织的更多相关文章

  1. Objective-C 基础教程第七章,深入理解Xcode

    目录 Object-C 基础教程第七章,深入理解Xcode 0x00 前言 0x01 创建工程界面 0x02 主程序界面 ①顶部 Top Test(测试) Profile(动态分析) Analyze( ...

  2. Objective-C 基础教程第三章,面向对象编程基础知

    目录 Objective-C 基础教程第三章,面向对象编程基础知 0x00 前言 0x01 间接(indirection) 0x02 面向对象编程中使用间接 面向过程编程 面向对象编程 0x03 OC ...

  3. Objective-C 基础教程第五章,复合

    目录 Objective-C 基础教程第五章,复合 什么是复合? Car程序 自定义NSLog() 存取方法get Set Tires(轮胎) 存取方法 Car类代码的其他变化 扩展Car程序 复合还 ...

  4. [ABP教程]第六章 作者:领域层

    Web开发教程6 作者:领域层 关于此教程 在这个教程系列中,你将要构建一个基于ABP框架的应用程序 Acme.BookStore.这个应用程序被用于甘丽图书页面机器作者.它将用以下开发技术: Ent ...

  5. css3基础教程十六变形与动画animation

    前面我们讲过的变形与动画一般都是通过鼠标的单击.获得焦点,被点击或对元素进行一定改变后以后触发效果的,那么有没有像Flash一样自动播放的动画效果呢?答案当然是肯定的,这就是我们今天要讲到的anima ...

  6. Python机器学习基础教程-第2章-监督学习之决策树

    前言 本系列教程基本就是摘抄<Python机器学习基础教程>中的例子内容. 为了便于跟踪和学习,本系列教程在Github上提供了jupyter notebook 版本: Github仓库: ...

  7. Python机器学习基础教程-第2章-监督学习之线性模型

    前言 本系列教程基本就是摘抄<Python机器学习基础教程>中的例子内容. 为了便于跟踪和学习,本系列教程在Github上提供了jupyter notebook 版本: Github仓库: ...

  8. Python机器学习基础教程-第2章-监督学习之K近邻

    前言 本系列教程基本就是摘抄<Python机器学习基础教程>中的例子内容. 为了便于跟踪和学习,本系列教程在Github上提供了jupyter notebook 版本: Github仓库: ...

  9. Python机器学习基础教程-第1章-鸢尾花的例子KNN

    前言 本系列教程基本就是摘抄<Python机器学习基础教程>中的例子内容. 为了便于跟踪和学习,本系列教程在Github上提供了jupyter notebook 版本: Github仓库: ...

随机推荐

  1. 这个命令行HTTP客户端工具真不错

    程序员专属微信红包封面1000个,兑换码:dWK7fUs2WQG cURL相信很多做开发的.运维的都不陌生,是非常有用的一个终端请求工具,借助于它可以在命令行中进行HTTP.FTP等请求,在Linux ...

  2. Elasticsearch (1) 文档操作

    本文介绍如何在Elasticsearch中对文档进行操作. 1.检查Elasticsearch及Kibana运行是否正常 在浏览器输入192.168.6.16:9200,有如下输出则说明Elastic ...

  3. Nacos极简教程

    简介 Nacos是服务发现与注册,服务配置中心. Nacos 具有如下特性: 服务发现和服务健康监测:支持基于DNS和基于RPC的服务发现,支持对服务的实时的健康检查,阻止向不健康的主机或服务实例发送 ...

  4. Java协变、逆变、类型擦除

    协变.逆变 定义 Java中String类型是继承自Object的,姑且记做String ≦ Object,表示String是Object的子类型,String的对象可以赋给Object的对象.而Ob ...

  5. VMware网络连接模式(桥接、NAT以及仅主机模式的详细介绍和区别)

    VMware 桥接模式 VMware桥接模式,也就是将虚拟机的虚拟网络适配器与主机的物理网络适配器进行交接,虚拟机中的虚拟网络适配器可通过主机中的物理网络适配器直接访问到外部网络(例如图中所示的局域网 ...

  6. 抽签小程序(C语言随机数)

    最近班级里需要人员抽签参加活动,闲来无事用java的(Math.random()方法||java.util.Random())写了一个随机抽签的,所以我又了解了一下C语言的随机数获取. C语言的随机数 ...

  7. NSArray基本概念

    1.NSArray的基本概念 什么是NSArray? NSArray是OC中的数组类,开发中建议尽量使用NSArray替代C语言中的数组 C语言中数组的弊端 int array[4] = {10, 8 ...

  8. MySQL数据库授权与索引

    MySQL数据库授权与索引 目录 MySQL数据库授权与索引 一.数据库用户授权 1. 授予权限 2. 查看权限 3. 删除权限 4. 全部权限(all privileges) 二.MySQL索引 1 ...

  9. 鸟哥的Linux私房菜学习笔记——文件权限与目录配置

    Linux的文件权限和目录配置 在linux中的每个用户必需属于一个组,不能独立于组外.在linux中每个文件有所有者.所在组.其它组的概念. (1)所有者 一般为文件的创建者,谁创建了该文件,就是天 ...

  10. Sublime Text3安装及汉化

    Sublime Text 是一款流行的代码编辑器软件,也是HTML和散文先进的文本编辑器,可运行在Linux,Windows和Mac OS X.也是许多程序员喜欢使用的一款文本编辑器软件. 下载地址: ...