我有以下项目结构:
他们没有关系(没有父子关系),只有两个导入,比如Main.h
我有:
#import Son1.h
#import Son2.h
如果,从我写的另一个文件
#import Main.h
我会看到Main.h
的所有方法/属性(这没关系)但我也会看到Son1.h
和Son2.h
的方法。
我该如何防止这种情况?
答案 0 :(得分:0)
了解#import
(和C版本:#include
)的作用非常重要。
C程序的编译在概念上有3个步骤:
以#
开头的指令由预处理器执行(根本不管这是一个单独的二进制文件还是编译器的一部分)。这两个语句都会导致命名文件的内容插入到找到该指令的位置的导入(或包含)文件中。这完全与语言无关。导入的文件中可以包含任何内容。如果你愿意,你可以导入一个JPG(但是好运编译!)。
在您的示例中,通过在Son1.h
中导入Son2.h
和Main.h
,您将从编译器的角度创建一个内容为Son1.h
的单个文件,然后Son2.h
的内容后跟Main.h
本身的内容。在这个层面上,隐藏内容的想法没有意义。您明确要求预处理器将这些内容放在那里。它对插入的文本一无所知,因此它不能遵循任何类型的Objective-C指令,即使存在这样的指令。
评论正在进入另一个角度。 .h
中的导入应保持绝对最低限度。导入的最常见原因是类和协议类型定义,而Objective-C允许您准确地转发这两个以避免必要的导入。
如果你有类似的话:
@interface MyClass : NSObject
@property(nonatomic, strong) MyOtherClass *myOtherClass;
@end
您通常需要#import "MyOtherClass.h"
。但是,使用前向声明,您可以改为:
@class MyOtherClass;
将#import
移动到实现文件,该文件通常对其他文件隐藏。