当前位置:  开发笔记 > 编程语言 > 正文

#import和@class之间的区别是什么,我何时应该使用另一个?

如何解决《#import和@class之间的区别是什么,我何时应该使用另一个?》经验,为你挑选了3个好方法。

在过去一个月左右的时间里,我一直在教自己Objective-C(我是一名Java负责人),现在我的大脑已经被大部分包围了.有一件事让我感到困惑:通过@class导入一个类与进行#import之间的区别是什么?

一个比另一个好,还是在某些情况下我需要使用一个而不是另一个?到目前为止我一直在使用#import.



1> Ben Gottlieb..:

#import将有问题的整个头文件带入当前文件; 该文件的任何文件#import也包括在内.另一方面,@ class(当在一行上使用某些类名时),只是告诉编译器"嘿,你很快就会看到一个新的令牌;它是一个类,所以这样对待它".

当你有"循环包含"的潜力时,这非常有用; 即,Object1.h引用Object2,Object2.h引用Object1.如果你们#import都把文件放到另一个文件中,那么编译器在尝试#importObject1.h时会感到困惑,查看它并看到Object2.h; 它尝试#importObject2.h,并看到Object1.h等.

另一方面,如果每个文件都有@class Object1;@class Object2;,那么就没有循环引用.只需确保实际#import(.m)文件中包含所需的标头.


Ben,Ben,你不必在Stack Overflow上回答每个Cocoa问题.你会筋疲力尽!

2> Dave Dribin..:

@class被称为前瞻性声明.你基本上告诉编译器该类存在但不是关于该类的任何内容.因此,它不知道像它的超类之类的东西以及它声明的方法.

作为一般规则,如果可能的话,在@class.h和#import.m中使用.就像路易斯说的那样,它将有助于加快编译时间.有时你需要#import在标题中的类.我现在能想到的案例是:

你是另一个类的子类

您正在实施协议

在这些情况下,您必须#import是声明类或协议的头文件,因为编译器需要知道其父类的完整类层次结构并实现协议.

FWIW,你也可以转发声明协议,只要你不实现它们:

@protocol SomeProtocol;

@interface ...

- (id)someMethod;

@end



3> Louis Gerbar..:

您要记住的另一件事是#imports减慢了编译时间,因为这意味着编译器需要提取并处理更多的头文件.这主要是通过使用预编译的头文件来掩盖的,但是我偶尔会将项目转换为corss导入的每个头文件,而不是在适当的地方使用@class,修复它们可以缩短编译时间.这是一个微妙的方式,系统强化了这样一个事实,即如果你只使用你真正需要的东西,那就更快了.

作为一般规则,我总是在我的头文件中使用@class声明,并且只#import超类.这符合Ben的建议,但我认为值得注意的是,即使您不担心循环引用,如果可以,最好限制头文件中的#imports.

推荐阅读
围脖上的博博_771
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有