这两个会生成相同的编译时间吗?

时间:2012-08-15 14:00:56

标签: iphone objective-c class

我知道@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

2 个答案:

答案 0 :(得分:2)

(假设您在这些文件中实际使用了BNRItem

对于BNRItemStore.m来说是相同的,但是对于#import s BNRItemStore.h的任何内容,它可能会增加编译时间和重新编译频率 - 因为很多需要的类很常见要查看BNRItemStore,您也不需要BNRItem的{​​{1}}。

当该模式扩展到项目中的许多标题时,对一个标题的简单编辑可能需要重新编译大量文件,并包含大量包含的文件。它也会传播到索引器,索引器会根据更改不断编制索引。

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

能够在@interface中声明所有实例变量/属性真的很棒 - 因为这是对clang的一个相当新的补充。抽象和构建时间可以显着改善。

答案 1 :(得分:0)

是和否。

您不会在编译时获得SAME。 @class只是告诉编译器它将看到该类,所以将它视为一个类(取出它,然后你得到错误),而#import告诉编译器完全导入.h该标题的(标题)文件。

所以它会慢一些(正如你的建议),特别是如果类.h的{​​{1}}(标题)文件是任何其他文件。对于不需要所有功能的接口,您只需要定义。

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