Dlaczego ProjectName-Prefix.pch nie jest tworzony automatycznie w Xcode 6?

264

Dlaczego nie jest ProjectName-Prefix.pchtworzony automatycznie w Xcode 6?

Czy nagłówek prekompilacji nie jest już potrzebny?

Gdzie mam napisać kod, który był ProjectName-Prefix.pchwcześniej?

Wei
źródło

Odpowiedzi:

136

Podejrzewam, że z powodu modułów, które eliminują potrzebę #import <Cocoa/Cocoa.h>.

Co do tego, gdzie umieścić kod, który należy umieścić w nagłówku prefiksu, nie ma kodu, który należy umieścić w nagłówku prefiksu. Umieść swoje importy w plikach, które ich potrzebują. Umieść swoje definicje we własnych plikach. Umieść swoje makra ... nigdzie. Przestań pisać makra, chyba że nie ma innej możliwości (na przykład kiedy potrzebujesz __FILE__). Jeśli potrzebujesz makr, umieść je w nagłówku i dołącz.

Nagłówek prefiksu był niezbędny dla rzeczy, które są ogromne i używane przez prawie wszystko w całym systemie (jak Foundation.h). Jeśli masz coś tak ogromnego i wszechobecnego, powinieneś przemyśleć swoją architekturę. Nagłówki prefiksów utrudniają ponowne użycie kodu i wprowadzają subtelne problemy z kompilacją, jeśli którykolwiek z wymienionych plików może ulec zmianie. Unikaj ich, dopóki nie pojawi się poważny problem z czasem kompilacji, który możesz wykazać, że został znacznie poprawiony dzięki nagłówkowi prefiksu.

W takim przypadku możesz go utworzyć i przekazać go do brzęku, ale jest to niezwykle rzadkie, że to dobry pomysł.


EDYCJA: Na twoje konkretne pytanie dotyczące interfejsu, którego używasz we wszystkich kontrolerach widoku, tak, powinieneś absolutnie zaimportować go do każdego kontrolera widoku, który faktycznie go używa. To wyjaśnia zależności. Kiedy ponownie użyjesz kontrolera widoku w nowym projekcie (co jest powszechne, jeśli dobrze zbudujesz kontrolery), natychmiast dowiesz się, czego wymaga. Jest to szczególnie ważne w przypadku kategorii, które mogą utrudnić ponowne użycie kodu, jeśli są niejawne.

Plik PCH nie pozwala pozbyć się zależności od list. Nadal powinieneś importować UIKit.hlub Foundation.hw razie potrzeby, podobnie jak szablony Xcode. Powodem PCH jest skrócenie czasu kompilacji w przypadku naprawdę dużych nagłówków (jak w UIKit).

Rob Napier
źródło
102
@ Rob, twoja odpowiedź jest subiektywna. Nie zgadzam się, że należy przyjąć jako odpowiedź na to pytanie. Jak zaimplementowałbyś coś takiego jak ten github.com/seancook/TWReverseAuthExample/blob/… bez pch? Zaimportować dziennik do każdego pliku? To tworzy cały stos niepotrzebnego wzdęcia w twoim kodzie.
Maxim Veksler
26
Każdy plik, który faktycznie używa tego makra, tak (z mojego doświadczenia wynika, że ​​zwykle jest to mniej niż każdy plik w systemie). To bardzo dobry przykład mojej tezy. Importowanie go niejawnie maskuje fakt, że masz zależność od tego makra rejestrowania. Podczas próby skopiowania TWAPIManager.m, na przykład, do innego projektu, otrzymasz błędy, które TWALog()nie są zdefiniowane, bez żadnej wskazówki, gdzie je znaleźć. Właśnie ten problem spotkałem w kilku dużych projektach próbujących współdzielić kod. Utworzenie TWAPILog.hi zaimportowanie rozwiązuje to przy niewielkich kosztach tworzenia.
Rob Napier
5
Używam ReactiveCocoa w prawie każdej klasie, byłoby szaleństwem, gdybym nie używał pliku pch ...
Stefano Mondino
2
Nie tylko moduły, ale szybkie wsparcie jest prawdopodobnie dużym elementem.
uchuugaka
12
Kluczem jest to, że PCH jest wstępnie skompilowanym nagłówkiem . Kompilacja wstępna służy do zapewnienia wydajności kompilacji, a nie automatycznej dostępności. Prekompilacja wprowadza kilka sposobów na zepsucie twojej kompilacji i powinna być zarezerwowana dla wielkich rzeczy, które nigdy nie zmieniają się pomiędzy nieoczyszczonymi kompilacjami (jak Fundacja).
Rob Napier
425

Bez pytania, czy jest to właściwe, czy nie, możesz ręcznie dodać plik PCH:

  1. Dodaj nowy plik PCH do projektu: Nowy plik> Inne> Plik PCH .

  2. W opcji Ustawienia kompilacji obiektu docelowego ustaw wartość Nagłówka prefiksu na nazwę pliku PCH, z nazwą projektu jako prefiksem (tzn. Dla nazwanego projektu TestProjecti pliku PCH MyPrefixHeaderFiledodaj wartość TestProject/MyPrefixHeaderFile.pchdo listy).

    WSKAZÓWKA: Możesz użyć rzeczy takich jak $(SRCROOT)lub, $(PROJECT_DIR)aby dostać się do ścieżki, w której umieścisz .pchprojekt.

  3. W opcji Ustawienia kompilacji obiektu docelowego ustaw wartość Prekompilowanego nagłówka prefiksu na YES.

Yedidya Reiss
źródło
32
Pomimo moich opinii na temat plików PCH +1. Nadal przydatne jest, aby ludzie wiedzieli, jak korzystać z narzędzi.
Rob Napier
20
@ Yedidya, chciałem tylko podziękować za poświęcenie czasu na przekazanie odpowiedzi na pytanie, pomimo wszelkich osądów na ten temat. Doceniam to, że ludzie poświęcają czas, aby serdecznie odpowiedzieć na pytania, a nie tylko krytykować osobę za to, jak źle doradzono mi pytanie.
Campo
3
Dzięki. Przydaje mi się, gdy włączam część mojego Objective-C do projektu Swift, więc nie muszę wracać i dodawać wielu plików dołączanych do każdego z tych plików .m.
Chris Prince
Bardzo przydatne przy przechodzeniu z ObjC do Swift - mam mnóstwo bibliotek napisanych w ObjC, a ostatnią rzeczą, którą chcę zrobić, jest ich edycja, aby zawierały odpowiednie nagłówki systemowe.
Echelon
1
Nie działało to dla mnie, ponieważ użyłem ustawień kompilacji celu. Jednak gdy podążyłem za tym instruktinos modyfikując Ustawienia kompilacji projektu, wszystko działało.
Pauls,
128

Musisz utworzyć własny plik PCH
DodajNew file -> Other-> PCH file

Następnie dodaj ścieżkę tego pliku PCH do swojej kompilacji setting->prefix header->path

($ (SRCROOT) / nazwa_pliku.pch)

wprowadź opis zdjęcia tutaj

Prakash Raj
źródło
3
Cóż, w zależności od katalogu roboczego zmienne mogą się różnić. Używam$(PRODUCT_DIR)/$(PRODUCT_NAME)/PrefixHeader.pch
Alejandro Iván
Jeśli plik .pch będzie przechowywany w określonym folderze, sytuacja się pojawi.
Prakash Raj
51

Pokażę ci zdjęcie!

  1. Dodaj nowy plik Dodaj nowy plik

  2. Przejdź do Project / Build Setting / APPl LLVM 6.0-Language Dodaj nowy plik

Slemon
źródło
24

Aby dodać plik .pch

1) Dodaj nowy plik .pch do swojego projektu-> Nowy plik-> inny-> plik PCH

2) Przejdź do ustawień kompilacji projektu.

3) Wyszukaj „nagłówek prefiksu”. Można to znaleźć pod Apple LLVM.

4) Wklej to w pole $(SRCROOT)/yourPrefixHeaderFileName.pch

5) Oczyść i zbuduj projekt. Otóż ​​to!!!

wprowadź opis zdjęcia tutaj

Subham93
źródło
12

Jeśli zdecydujesz się ręcznie dodać plik .pch i chcesz używać Objective-C tak jak przed xCode 6, będziesz musiał również zaimportować frameworki UIKit i Foundation do pliku .pch. W przeciwnym razie konieczne będzie ręczne zaimportowanie tych ram w każdym pliku nagłówka. Możesz dodać poniższy kod, który testuje używany język:

#ifdef __OBJC__
    #import <UIKit/UIKit.h>
    #import <Foundation/Foundation.h>
#endif
mgm
źródło
2
Wszystko, co wiąże się z kodem ObjC, musi być zawarte w powyższym #ifdef _ OBJC _, w przeciwnym razie wystąpią błędy ze źródeł C (jeśli masz takie źródła), których nigdy nie zrozumiesz
ishahak
7

Posługiwać się :

$ (PROJECT_DIR) / Nazwa projektu / PrefixHeader.pch

Arash Zeinoddini
źródło
1
Czy istnieje jakaś deklaracja $ dla „Nazwa projektu”?
Amit,
7

Aby dodać nowy plik PCH, wykonaj następujące czynności:

(1) Dodaj nowy podgląd - wybierz iOS - inny i plik PCH

(2) dodaj ścieżkę tego pliku PCH do swojego projektu - BuildSetting - Apple LLVM 6.0 Language

Dodaj zestaw Prefiks Ścieżka nagłówka YourApplicationName (root-path) /filename.pch

Hitesh Vaghela
źródło
Uprzejmie wyjaśnij ostatni. Dodaj ustawioną ścieżkę nagłówka prefiksu.
Naveed Abbas,