Objective c #导入的使用——在大型项目中使用#导入的一般指南(ObjC)

Objective c #导入的使用——在大型项目中使用#导入的一般指南(ObjC),objective-c,xcode,dependencies,header-files,build-time,Objective C,Xcode,Dependencies,Header Files,Build Time,在哪里导入我的头和实现? 有关于我应该做什么的规定吗? 是否有办法将所有内容导入到单个头文件中?可以使用以下约定: 当需要时,在头文件中使用#import -您可以为导入的类创建子类 -使用导入的头文件中的协议 -您可以使用导入的头文件中的其他C数据结构(enum、struct) 例如: #import "SuperClass.h" #import "Protocol.h" @class SomeOtherClass @interface Subclass : SuperClass <

在哪里导入我的头和实现?
有关于我应该做什么的规定吗?

是否有办法将所有内容导入到单个头文件中?

可以使用以下约定:

当需要时,在头文件中使用
#import
-您可以为导入的类创建子类 -使用导入的头文件中的协议 -您可以使用导入的头文件中的其他C数据结构(enum、struct)

例如:

#import "SuperClass.h"
#import "Protocol.h"

@class SomeOtherClass

@interface Subclass : SuperClass <Protocol>
    SomeOtherClass _instanceVariableToOtherClass
@end
因此,它注意每个类只导入一次,以防止包含循环/循环。

它类似于C语言中的include语句

基本上,
#import
语句有两个定义

1) #import "headerFile.h" // This statement is use for Import any header file in current file (UIController)

2) #import<FramWorkName> // This statement basically use for add any framework in current file (UIController)
您还可以使用协议来定义将由其他类实现的方法

给出了“在大型项目中使用导入的一般指导原则”

<> P>对象C在这方面很像C和C++。将所有
#include
s/
#import
s填充到头文件中会引入大量不必要的依赖项,这会为构建增加大量时间。因此,在C和C++依赖性的主题中也可以寻求进一步的信息。 在哪里导入我的头和实现

通常,您应该仅在存在物理依赖关系的情况下编写
#import
。由于每个Objc对象都是引用计数的,并且您的属性/ IVARS通常不需要存在于页眉中,所以<代码>导入> <代码> s远低于C++。 罗宾·范·迪克在他的回答中概述了身体依赖的常见案例(+1)

有关于我应该做什么的规定吗? 有没有一种方法可以在一个头文件中导入所有内容

嗯,这取决于你项目的规模。有些人将他们使用的所有框架添加到PCH(预编译头)。有些人将最常用的文件放在PCH中,有些人根本不使用PCH文件。构建时间越长,项目越复杂,PCH应该包含的内容就越少

如果你在“非常大”的项目上工作,你不应该在PCH上添加更多的基础。 另一个常见的错误是,有些人会使用PCH,所以他们需要少(几乎)打字。问题是他们的项目的通用include/header发生了更改,当这种情况发生时,必须完全重建目标

此外,如果可以避免在标题中导入框架/库,则可以节省大量构建时间

#import
s添加到标题会增加依赖关系,从而导致依赖关系进一步扩散。大量不相关的代码/框架只需要对少数源文件可见,就很容易对大部分源文件可见

最后,您应该真正尝试将经常更改的标题保留在其他标题之外

最大的收获是你应该:

  • 根据功能分离您的程序
  • 与导入相比,支持转发声明。编译器必须知道名称,但通常只有在创建/发送对象消息时才需要导入
  • 尝试将依赖性很强的实现保存在
    *.m
    文件中
每隔一段时间,它就可以帮助你查看一些源文件的预处理输出——看看什么是真正的
#import
ed——结果会非常令人惊讶

注:

  • 必须为项目中的每种语言生成PCH
  • 根据他们的需要编译资源;e、 如果你有C程序,不要把它们编译成ObjC
  • 随着项目复杂性的增加,通过除以目标(例如静态库、模块、逻辑划分测试…)获得的收益将增加。以低依赖性正确构建依赖目标本身就是一个大主题。如果结构正确,它确实可以帮助您以更高的频率构建和测试(如果您使用连续集成或有多个开发人员,这一点也很重要)。与头依赖关系一样,如果从一开始就不考虑这一点,旧的问题可能需要大量的工时来纠正(在它已经变得难以忍受的缓慢)之后。

只是为了好玩-我要补充一些“基本原则”-虽然没有已经说过的那么详细-有时可以帮助理解整个“过程”

Implementation.m
文件从未(据我所知)
#import
'ed-这就是编译器“编译”时“正在做的”

希望所有编译(
.m
)文件“了解”的任何头都可以放在
.pch
文件中。我通常还会在所有类中粘贴共享的指令,例如,
#import
,等等,所以我不必在每个文件中查看它们

如果要在头文件中引用以前未声明的类,即
AppDelegate.h

@property (nonatomic, strong) HTTPServer *http;
您可以
#导入该文件顶部的“HTTPServer.h”(甚至在
.pch`)中)。。。但通常最好参照“前进类”如下

 @class HTTPServer;
 @interface AppDelegate : NSObject  ➜ ...
然后在
AppDelegate
.m
文件中导入“HTTPServer.h”。您需要访问头文件的主要原因。。。是调用方法,并在您自己的类的“范围”内使用该外部类的实例的属性等。这就是为什么你可以在标题中简单地“提及”类
@class
,而“侥幸逃脱”——实际上你还没有用它做任何事情

另一个要考虑的问题——如果你正在构建一个独立的应用程序,这可能不是这样的,但是当构建一个框架或一个包等等……,其中你的类将以一种“API的方式”来引用……

@property (nonatomic, strong) HTTPServer *http;
 @class HTTPServer;
 @interface AppDelegate : NSObject  ➜ ...
#import <Foundation/NSArray.h>
#import <Foundation/NSAutoreleasePool.h>