ProjectName-Prefix.pch neden Xcode 6'da otomatik olarak oluşturulmuyor?


264

Neden ProjectName-Prefix.pchotomatik olarak oluşturulmaz Xcode 6?

Ön derleme üstbilgisine artık gerek yok mu?

Daha ProjectName-Prefix.pchönce olan kodu nereye yazmalıyım ?

Yanıtlar:


136

Modüllerden şüpheleniyorum ki bu da ihtiyacı ortadan kaldırıyor #import <Cocoa/Cocoa.h>.

Bir önek başlığına koyacağınız kodu nereye koyacağınıza ilişkin olarak, bir önek başlığına koymanız gereken kod yoktur. İçe aktarmalarınızı ihtiyaç duyulan dosyalara yerleştirin. Tanımlarınızı kendi dosyalarına koyun. Makrolarınızı koyun ... hiçbir yere. Başka bir yol yoksa (gerektiğinde olduğu gibi) makro yazmayı bırakın __FILE__. Makrolara ihtiyacınız varsa, bunları bir başlığa koyun ve ekleyin.

Önek başlığı, büyük ve tüm sistemdeki neredeyse her şey tarafından kullanılan şeyler için gerekliydi (gibi Foundation.h). Bu kadar büyük ve her yerde bulunan bir şeyiniz varsa, mimarinizi yeniden düşünmelisiniz. Önek başlıkları kodun yeniden kullanılmasını zorlaştırır ve listelenen dosyalardan herhangi biri değişebilirse küçük derleme sorunları getirir. Bir önek üstbilgisi ile önemli ölçüde geliştirildiğini gösterebileceğiniz ciddi bir oluşturma süresi sorunu olana kadar bunlardan kaçının.

Bu durumda bir tane oluşturabilir ve clang'a aktarabilirsiniz, ancak iyi bir fikir olması inanılmaz derecede nadirdir.


EDIT: Tüm görünüm denetleyicilerinde kullandığınız bir HUD ile ilgili sorunuza, evet, onu gerçekten kullanan her görünüm denetleyicisine kesinlikle almanız gerekir. Bu bağımlılıkları netleştirir. Görünüm denetleyicinizi yeni bir projede yeniden kullandığınızda (denetleyicilerinizi iyi oluşturursanız yaygındır), ne gerektirdiğini hemen anlayacaksınız. Bu, özellikle örtük olmaları durumunda kodun yeniden kullanılmasını zorlaştırabilen kategoriler için önemlidir.

PCH dosyası, listeleme bağımlılıklarından kurtulmak için orada değildir. Xcode şablonlarının yaptığı gibi yine de UIKit.hveya Foundation.hgerektiği gibi içe aktarmanız gerekir . PCH'nin nedeni, gerçekten büyük başlıklarla (UIKit'te olduğu gibi) çalışırken derleme sürelerini iyileştirmektir.


102
@ Cevabınız öznel ranttır. Bu soruya cevap olarak kabul edilmesi gerektiği konusunda hemfikir değilim. Nasıl github.com/seancook/TWReverseAuthExample/blob/… gibi bir şeyi pch olmadan nasıl uygularsınız ? Günlük her dosyaya aktarılsın mı? Bu, kodunuzda gereksiz bir şişkinlik yığını oluşturur.
Maxim Veksler

26
Bu makroyu kullanan her dosya, evet (benim deneyimime göre bu genellikle sistemdeki her dosyadan daha azdır). Bu benim açımdan çok güzel bir örnek. Bunu içe aktarma, bu günlükleme makrosuna bağımlı olduğunuz gerçeğini gizler. TWAPIManager.mÖrneğin başka bir projeye kopyalamaya çalıştığınızda , TWALog()nerede bulacağınıza dair bir ipucu olmadan tanımlanmayan hatalar alırsınız . Kod paylaşmaya çalışan birkaç büyük projede tam olarak bu sorunla karşılaştım. Yaratmak TWAPILog.hve ithal etmek, bunu önemsiz dev maliyetiyle çözüyor.
Rob Napier

5
ReactiveCocoa'yı hemen hemen her sınıfta kullanıyorum, bir pch dosyası kullanmam benim için çılgınca olurdu ...
Stefano Mondino

2
Sadece modüller değil, hızlı destek muhtemelen büyük bir parçadır.
uchuugaka

12
Anahtar PCH önceden derlenmiş bir başlık olmasıdır . Ön derleme, otomatik kullanılabilirlik için değil, yapı performansı içindir. Ön derleme, yapınızı bozmanın çeşitli yollarını sunar ve temiz olmayan yapılar (Vakıf gibi) arasında asla değişmeyen büyük şeyler için ayrılmalıdır .
Rob Napier

425

Doğru olup olmadığı sorusu olmadan, PCH dosyasını manuel olarak ekleyebilirsiniz:

  1. Projeye yeni PCH dosyası ekleyin: Yeni dosya> Diğer> PCH dosyası .

  2. Hedefin Oluşturma Ayarları seçeneğinde, Önek Başlığı değerini proje adı önek olarak PCH dosya adınıza ayarlayın (yani adlandırılmış proje TestProjectve PCH dosyası adlandırılmışsa MyPrefixHeaderFile, değeri TestProject/MyPrefixHeaderFile.pchpliste ekleyin ).

    İPUCU: Projeye koyduğunuz yerin yoluna gitmek için $(SRCROOT)veya gibi şeyleri kullanabilirsiniz .$(PROJECT_DIR).pch

  3. Hedefin At Yapı ayarlar seçeneği değerini ayarlamak precompile önek Başlık için YES.


32
PCH dosyaları hakkındaki görüşlerime rağmen +1. İnsanların araçları nasıl kullanacaklarını bilmesi hala yararlıdır.
Rob Napier

20
@Yididya, bu konuda verdiğiniz yargılara rağmen sorunun cevabını iletmek için zaman ayırdığınız için hızlı bir teşekkür etmek istedim. İnsanların, soruyu ne kadar önermiş olduğu konusunda kişiyi sorgulamaktan ziyade soruları canlandırmak için zaman ayırdıklarını takdir ediyorum.
campo

3
Teşekkürler. Objective-C'mden bazılarını bir Swift projesine dahil ederken faydalı buluyorum, bu yüzden geri dönüp bu .m dosyalarının her birine bir grup içerme dosyası eklemem gerekmiyor.
Chris Prince

ObjC'den Swift'e geçiş yaparken çok kullanışlı - ObjC'de yazılmış bir yığın kitaplığım var ve yapmak istediğim son şey, doğru sistem başlıklarını içerecek şekilde hepsini düzenlemek.
Echelon

1
Bu benim için işe yaramadı çünkü hedefin oluşturma ayarlarını kullandım. Ancak, bu talimatları izlediğimde, Proje Oluşturma Ayarlarında değişiklik yapmak yerine her şey işe yaradı.
Pauls

128

Kendi PCH dosyasını oluşturmanız gerekir
EkleNew file -> Other-> PCH file

Ardından bu PCH dosyasının yolunu derlemenize ekleyin setting->prefix header->path

($ (SRCROOT) /filename.pch)

resim açıklamasını buraya girin


3
Peki, çalışma direkine bağlı olarak değişkenler değişebilir. Ben kullanıyorum$(PRODUCT_DIR)/$(PRODUCT_NAME)/PrefixHeader.pch
Alejandro Ivan

.Pch dosyasını belirli bir klasörde tutarsanız, durum ortaya çıktı.
Prakash Raj

51

Sana bir resim göstereyim!

  1. Yeni bir dosya ekle Yeni bir dosya ekle

  2. Git Proje / Yapı Ayarı / Appl LLVM 6.0-Dil Yeni bir dosya ekle


24

.Pch dosyası eklemek için

1) Projenize yeni .pch dosyası ekleyin-> Yeni dosya-> diğer-> PCH dosyasına

2) Projenizin yapım ayarlarına gidin.

3) "önek başlığı" nı arayın. Bunu Apple LLVM altında bulabilirsiniz.

4) Bunu alana yapıştırın $(SRCROOT)/yourPrefixHeaderFileName.pch

5) Projeyi temizleyin ve inşa edin. Bu kadar!!!

resim açıklamasını buraya girin


12

Manuel olarak bir .pch dosyası eklemeye karar verirseniz ve Objective-C'yi xCode 6'dan önceki gibi kullanmak istiyorsanız, .pch dosyasına UIKit ve Foundation çerçevelerini de aktarmanız gerekir. Aksi takdirde, bu çerçeveleri her başlık dosyasına manuel olarak içe aktarmanız gerekir. Aşağıdaki kodu, kullanılan dili test ettiği için yine de ekleyebilirsiniz:

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

2
ObjC kodunu içeren her şey yukarıdaki #ifdef _ OBJC _ içine sarılmalıdır , aksi takdirde asla anlamayacağınız C kaynaklarından (bu tür kaynaklarınız varsa) hatalar alırsınız
ishahak

7

Kullanım:

$ (PROJECT_DIR) / Proje adı / PrefixHeader.pch


1
"Proje Adı" için herhangi bir $ tür bildirim var mı ??
Amit

7

Yeni PCH dosyası eklemek için aşağıdaki adımları izleyin:

(1) Yeni görüntü ekle - Seç iOS - Diğer ve PCH Dosyası

(2) bu PCH dosyasının yolunu Projenize ekleyin - BuildSetting - Apple LLVM 6.0 Dil

Set Önek Başlığı Yolu EkleUygulamaAdınız (kök yolu) / dosyaadı.pch


Lütfen sonuncuyu açıklayınız. Ayarlanmış önek başlık yolu ekleyin.
Naveed Abbas
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.