2

我知道@class 是为了加快编译时间,但如果我遇到这样的情况:

#import <Foundation/Foundation.h>
@class BNRItem;
@interface BNRItemStore : NSObject
@end

#import "BNRItemStore.h"
#import "BNRItem.h"

@implementation BNRItemStore
@end

我可以这样做并且仍然获得相同的编译时间:

#import <Foundation/Foundation.h>
#import "BNRItem.h"
@interface BNRItemStore : NSObject
@end

#import "BNRItemStore.h"

@implementation BNRItemStore
@end
4

2 回答 2

2

(假设您实际上BNRItem在这些文件中使用了某个地方)

对于 s也是一样的BNRItemStore.m,但它可能会增加任何#imports 的编译时间和重新编译频率BNRItemStore.h——因为许多需要查看的类BNRItemStore通常不需要也查看BNRItems @interface

由于该模式扩展到项目中的许多标头,因此对一个标头的简单编辑可能需要重新编译大量文件,其中包含大量包含文件。它还会传播到索引器,该索引器会根据变化不断进行索引。

最好使用前向声明,除非您的项目(并且将保持)很小。

能够在.m- 中声明所有实例变量/属性实际上非常好,因为这是对 clang 的一个相当新的补充。抽象和构建时间可以显着改善。

于 2012-08-15T14:16:25.280 回答
0

是和不是。

你不会在编译时得到相同的结果。@class只是告诉编译器它会看到那个类,所以把它当作一个类(把它拿出来,你会得到错误),而#import告诉编译器完全导入.h那个类的(头)文件。

所以它会更慢(正如你所建议的那样),特别是如果.h类的(头)文件#import是任何其他文件。对于不需要所有功能的接口,您只需要定义。

但就所有意图和目的而言,就您而言,感知到的功能是完全相同的,所以在这方面是的。

于 2012-08-15T14:07:23.503 回答