我知道@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
答案 0 :(得分:2)
(假设您在这些文件中实际使用了BNRItem
)
对于BNRItemStore.m
来说是相同的,但是对于#import
s BNRItemStore.h
的任何内容,它可能会增加编译时间和重新编译频率 - 因为很多需要的类很常见要查看BNRItemStore
,您也不需要BNRItem
的{{1}}。
当该模式扩展到项目中的许多标题时,对一个标题的简单编辑可能需要重新编译大量文件,并包含大量包含的文件。它也会传播到索引器,索引器会根据更改不断编制索引。
最好使用前向声明,除非你的项目是(并且将保持)很小。
能够在@interface
中声明所有实例变量/属性真的很棒 - 因为这是对clang的一个相当新的补充。抽象和构建时间可以显着改善。
答案 1 :(得分:0)
是和否。
您不会在编译时获得SAME。 @class
只是告诉编译器它将看到该类,所以将它视为一个类(取出它,然后你得到错误),而#import
告诉编译器完全导入.h
该标题的(标题)文件。
所以它会慢一些(正如你的建议),特别是如果类.h
的{{1}}(标题)文件是任何其他文件。对于不需要所有功能的接口,您只需要定义。
但是就所有意图和目的而言,就你所关注的而言,所感知的功能是完全相同的,所以在这方面是的。