objective-c - 关于@class 的前向类声明

标签 objective-c ios

我知道在 .h 中放置前向类声明 (@class ClassA) 并在 .m 中放置#import "ClassA.h"是正确的做法。而且我知道这样做可以让编译器稍后编译它(直到 #import it in the .m)。

通常我们在A.h中使用@class ClassA同时在A.m中添加#import ClassA.h,虽然编译器不会在A.h中编译ClassA,但编译器仍然必须在A.m中编译它。 那么为什么不直接在 A.h 中使用#import呢?

最佳答案

你几乎从不在 A.h 中使用 @Class A。通常的做法是在A.h中使用@Class B,在B.h中使用@Class A。这样做的原因是为了避免 .h 文件中的循环依赖。如果 A.h 导入 B.h,B.h 导入 A.h,编译器将从循环依赖中爆炸。

你的最后一句话似乎在问为什么我们从不在 A.h 中导入 A.h。我认为为什么没有这样做是很明显的。

请记住,头文件 (.h) 旨在尽可能少地告诉世界您的声明。它在那里告诉编译器 - “嘿,我们有一个类(@interface),其中包含一些方法和属性。这些方法使用这些其他类。我们对其他类使用@class,因为此时我们只需要知道最终会有这样的类。这足以让编译器满意,这样它就可以完成它的工作。最终,链接器最终决定这些类是否真的存在于某处。

源文件 (.m) 需要进行实际导入,因为编译器需要验证是否确实存在您尝试使用的方法和属性。但是头文件不调用方法,也不调用属性。它只是简单地说明 - “这个东西存在”。

关于objective-c - 关于@class 的前向类声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13618120/

相关文章:

ios - 来自另一个 UIVIewController 的 selectRowAtIndexPath 不起作用

ios - 使用 isKindOfClass : I don't understand why this code is behaving this way

objective-c - Swift/ObjC 循环导入

objective-c - 数组。如何实现 map 功能?

java - Objective-C 和 Java 原始数据类型

ios - MapKit iOS 9 detailCalloutAccessoryView 用法

objective-c - 如何循环查找数组?

iphone - 输入文本时在 UIAlertView 中启用按钮 - 多个警报 View

ios - 将较暗的透明背景设置为图像上的标签

ios - 使用 AVPlayer-Swift 无缝循环播放视频