gpt4 book ai didi

objective-c - 为什么在 AppDelegate.h 中为 ViewController 使用 @class 而不是#import?

转载 作者:搜寻专家 更新时间:2023-10-30 19:51:02 25 4
gpt4 key购买 nike

我在 Objective C 中有一个基本的最佳实践问题。我理解 @class#import 之间的区别,但我不明白为什么默认的 Apple Xcode 模板这样做:

AppDelegate.h:

@class ViewController;

.m:

#import "ViewController.h

当您可以将后者 #import 放在 .h 中并在 中提及 ViewController 时。 m 一共,从而简化了 1 行代码。

当然,节省 1 行代码不是问题,我只是好奇为什么要这样做?

最佳答案

@class ViewController; 行是前向声明,因此编译器知道名称 ViewController 的含义。重点是尽量在头文件中执行尽可能少的 #import 以加快编译速度。

想象一个文件 a.h 执行 #import "b.h"。现在,每个导入 a.h 的文件都会自动导入 b.h,这会增加编译器必须完成的工作量。通过使用前向声明,通常可以避免此类额外的导入,从而避免编译器的额外工作。

项目越大,类层次结构和依赖关系越复杂,这些 #import 就越可能成为问题。因此,最好养成尽可能使用前向声明的习惯。

编辑:在评论之后,另一个重要的用例浮出水面:解决循环依赖。例如,如果 A 类想要引用 B 类,反之亦然,则必须先定义一个。但是因为他们需要了解对方,所以我们有一个悖论。是这样解决的:

// Tell the compiler: B will be a class type.
@class B;

// Now we can define A, the compiler has enough
// information to know what B means.
@interface A : NSObject {
B *b;
}
@end

// Since A is now defined, we can define B.
// Cycle is resolved.
@interface B : NSObject {
A *a;
}
@end

关于objective-c - 为什么在 AppDelegate.h 中为 ViewController 使用 @class 而不是#import?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9016478/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com