2012-08-15 65 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是任何其他文件。對於一個界面你不需要所有的功能,你只需要定義。

但是對於所有意圖和目的而言,就您所關注的感知功能而言,完全相同,所以在這方面是肯定的。

相關問題