2012-08-15 74 views
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 
+2

'@ class'不是为了加快编译时间,而是为类设置前向声明。在你的例子中,似乎不需要'BNRItem'的前向声明。你可以使用#import# – rckoenes 2012-08-15 14:04:42

+0

@rckoenes不知道你在做什么 - 当用作替代不必要的'#import' /'#include'时,前向声明** do **加快了编译时间,减少依赖性。对于小型项目来说没有太大的区别,但可以在非常大的项目上节省数小时(每天)。或者从另一个角度来看 - 典型的增量版本可能是中型项目的秒数与分钟数。因为每个objc实例都是一个指针,所以如果结构化和维护正确,那么可以在大型项目上实现非常快的编译时间,因为它们之间的依赖性较低。 – justin 2012-08-15 14:37:25

+0

确实如此,但'@ class'并不只是为了加速代码,并且在大多数情况下它不是必需的。但是你说的是正确的,可以加快速度,但如果没有看到任何改进,LLVM也是如此。但它修复了一些项目中的一些圆圈引用。(这不应该在那里,但这是另一回事) – rckoenes 2012-08-15 14:50:24

回答

2

(假设你实际使用这些文件BNRItem某处)

这将是BNRItemStore.m相同,但它很可能会增加编译时间和重新编译频率任何#import小号BNRItemStore.h - 因为它是常见的许多需要看到BNRItemStore的课程不需要再看到BNRItem@interface

由于该模式传播到项目中的许多标题,对一个标题的简单编辑可能需要重新编译一大组文件,并且包含大量的包含文件。它也传播给索引器,索引器不断根据变化进行索引。

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

能够在.m中声明所有实例变量/属性实际上是非常好的 - 因为这是对clang的新增加。抽象和构建时间可以显着提高。

0

是的,没有。

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

所以它会比较慢(正如你所建议的),特别是(标题)文件的类#import是任何其他文件。对于一个界面你不需要所有的功能,你只需要定义。

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

相关问题