2011-06-24 9 views
16

, gördüğüm her Xcode şablon bir AppName-Prefix.pch aşağıdaki içeriği ile dosya içerir:Xcode şablonlarında neden Prefix.pch'yi çoğaltan #import var? iPhone programlama öğrenme iken

#ifdef __OBJC__ 
    #import <Foundation/Foundation.h> 
    #import <UIKit/UIKit.h> 
#endif 

Benim anlayış bu dosyanın içeriği kaynak kod dosyalarının her önüne ekleyerek olmasıdır derlemeden önce. Yine de, diğer dosyaların her biri de gereksiz görünen UIKit'i ithal ediyor. Örneğin, main.m Mac OS X

#import <UIKit/UIKit.h> 

int main(int argc, char *argv[]) { 
... 

Kakao uygulamaları önek dosyası ve başlık dosyaları hem Cocoa.h ithal aynı şeyi ... başlar.

Neden ikisi de var? Önek dosyası dışındaki tüm kaynak dosyalardan #import yönergelerini kaldırdım ve doğru şekilde derledim ve çalıştırdım.

cevap

12

Benim anlayış bu dosyanın içeriği derleme temelde doğru olduğunu

önce kaynak kod dosyalarının her önüne ekleyerek olmasıdır ancak ince noktalarını anlamak gerekir: Xcode kadar her derleme sonunda aşağı kaynar gcc veya clang'un bir çağrısı. Ne XCode yaptığı ilk X.pch dosyasını derlemek için: derlenmektedir

clang -x X.pch -o X.pch.gch 

ve sonra bireysel bir kaynak dosyasını (a.m diyelim), bu kullanım tetikler pch dosyayı yükler

clang -include X.pch a.m -o a.o 

sorunları önceden derlenmiş başlık. Yani, derleyici bakış açısından , bu gerçekten pch dosyasının içeriğinin otomatik olarak öneki değil. Daha ziyade, Xcode derleyiciyi çağırdığında önceden derlenmiş üstbilgiyi bir dosyaya ön ekler.

XCode'un gelecekteki bir sürümü sadece bunu yapmayı bırakabilir. Yani, #import s'yi .m veya .h dosyalarınızda tutmak daha iyidir.

Ayrıca, şu şekilde de düşünebilirsiniz: pch dosyasının kullanımı, Xcode'un sahnelerin arkasında, derleme işlemini hızlandırmak için ne yaptığıdır. Yani, UIKit.h dosyamızı .m/.h dosyalarımızdan almadığı için kodları temelde ona bağlı bir şekilde yazmamalıyız.

(Ayrıca, size .h ve .m dosyalarından doğru uygun başlık dosyalarını içe yoksa XCode4 en sözdizimi renklendirme karışır geliyor bana.)

3

Neden ikisi de var?

Üzgünüzden daha güvenli. Önceden derlenmiş başlıklar devre dışı bırakılabilir ve #import bir şeyi iki kez almazsa, ek yük önemsizdir.