Objective-C 基础教程第六章,源文件组织

Object-C 基础教程第六章,源文件组织

0x00:前言

到目前为止,我们讨论过的所有项目都是把源代码统统放入到了main.m文件中。这样随着项目越来越大,文件内容会越来越多,到后面我们的项目就不太好管理,因为所有东西都写在一起搜索起来也比较费劲。

现在我们需要学习Xcode用类文件的方式来区分.h .m将类,单独分类成文件的形式。

0x01:Xcode创建OC类

因为书中的例子已经非常老了不再适用,我这里用最新的Xcode13来演示之前的Car程序。

image-20220307222713606

选择CocoClass

image-20220307222751409

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

image-20220307222826043

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

image-20220307222923931

接着你们可以重复如上的操作,将其他类也创建成类文件,并且将代码移植过去最后如下图。

这样代码结构就清晰多了,而且后续要添加修改代码,就在指定的类文件中修改即可。

image-20220307223758678

0x02:Xcode群组

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

image-20220307225310995

并没有创建文件夹。

image-20220307225326138

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

image-20220307225414737

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

神奇,我们修改后还是可以编译,使得程序正常运行。

image-20220307231130654

说明:@class创建了一个前向引用。这是在告诉编译器:"相信我。以后你自然会知道这个类到底是什么,但是现在,你知道这些足矣。"

导入和继承

当我们想在子类里面也用上面这种方式就不行了,因为被继承的类他需要确切的知道父类中的详细数据,比如方法比如属性,这样你才能继承他,这样你才能重写他的方法。

image-20220307231605266

小结

在本章中,我们学习了使用多个文件来组织我们的源代码的基本技巧。这样使得我们看代码更加轻松,而且方便管理。

我们还学习了@class关键字的依赖关系,使得我们在编译文件时,可以让其时间变短,这得益于@class这关键字。

posted @ 2022-03-07 23:20  VxerLee昵称已被使用  阅读(323)  评论(0编辑  收藏  举报