Por que o ProjectName-Prefix.pch não é criado automaticamente no Xcode 6?

264

Por que não é ProjectName-Prefix.pchcriado automaticamente Xcode 6?

O cabeçalho de pré-compilação não é mais necessário?

Onde devo escrever o código que estava ProjectName-Prefix.pchantes?

Wei
fonte

Respostas:

136

Eu suspeito por causa de módulos, que removem a necessidade do #import <Cocoa/Cocoa.h>.

Quanto a onde colocar o código que você colocaria em um cabeçalho de prefixo, não há código que você deve colocar em um cabeçalho de prefixo. Coloque suas importações nos arquivos que precisam deles. Coloque suas definições em seus próprios arquivos. Coloque suas macros ... em lugar nenhum. Pare de escrever macros, a menos que não exista outra maneira (como quando você precisar __FILE__). Se você precisar de macros, coloque-as em um cabeçalho e inclua-o.

O cabeçalho do prefixo era necessário para coisas enormes e usadas por quase tudo em todo o sistema (como Foundation.h). Se você tem algo tão grande e onipresente, deve repensar sua arquitetura. Os cabeçalhos de prefixo dificultam a reutilização do código e introduzem sutis problemas de compilação, se algum dos arquivos listados puder mudar. Evite-os até que você tenha um sério problema de tempo de compilação que possa demonstrar que é dramaticamente aprimorado com um cabeçalho de prefixo.

Nesse caso, você pode criar um e passá-lo ao clang, mas é incrivelmente raro que seja uma boa ideia.


EDIT: Para sua pergunta específica sobre um HUD que você usa em todos os seus controladores de exibição, sim, você deve absolutamente importá-lo para todos os controladores de exibição que realmente o usam. Isso torna as dependências claras. Quando você reutilizar seu controlador de exibição em um novo projeto (o que é comum se você criar bem seus controladores), você saberá imediatamente o que ele requer. Isso é especialmente importante para categorias, que podem dificultar a reutilização do código se estiverem implícitas.

O arquivo PCH não existe para se livrar das listagens de dependências. Você ainda deve importar UIKit.hou Foundation.hconforme necessário, como os modelos do Xcode. O motivo do PCH é melhorar os tempos de compilação ao lidar com cabeçalhos realmente enormes (como no UIKit).

Rob Napier
fonte
102
@ Rob, sua resposta é retórica subjetiva. Não concordo que deva ser aceito como resposta a esta pergunta. Como você implementaria algo como este github.com/seancook/TWReverseAuthExample/blob/… sem pch? Importar o log para cada arquivo? Isso cria uma pilha inteira de inchaço desnecessário no seu código.
precisa
26
Cada arquivo que realmente usa essa macro, sim (na minha experiência, isso geralmente é menor que todos os arquivos do sistema). Este é um exemplo muito bom do meu argumento. Importá-lo mascara implicitamente o fato de você ter uma dependência dessa macro de log. Ao tentar copiar TWAPIManager.m, por exemplo, para outro projeto, você receberá erros que TWALog()não estão definidos, sem nenhuma dica sobre onde encontrá-lo. Eu encontrei exatamente esse problema em vários projetos grandes tentando compartilhar código. Criar TWAPILog.he importar resolve isso com um custo dev trivial.
9138 Rob Napier
5
Eu uso ReactiveCocoa em quase todas as classes, seria insano para mim não usar um arquivo PCH ...
Stefano Mondino
2
Não apenas módulos, mas o suporte rápido é provavelmente uma peça importante.
Uchuugaka
12
A chave é que PCH é um cabeçalho pré-compilado . A pré-compilação destina-se ao desempenho da compilação, não à disponibilidade automática. A pré-compilação apresenta várias maneiras de atrapalhar a sua compilação e deve ser reservada para grandes coisas que nunca mudam entre compilações não limpas (como a Foundation).
Rob Napier
425

Sem a pergunta se é apropriado ou não, você pode adicionar o arquivo PCH manualmente:

  1. Inclua um novo arquivo PCH no projeto: Novo arquivo> Outro> Arquivo PCH .

  2. Na opção Configurações de compilação do destino , defina o valor do cabeçalho do prefixo como o nome do arquivo PCH, com o nome do projeto como prefixo (ou seja, para o projeto nomeado TestProjecte o arquivo PCH nomeado MyPrefixHeaderFile, adicione o valor TestProject/MyPrefixHeaderFile.pchao plist).

    DICA: você pode usar coisas como $(SRCROOT)ou $(PROJECT_DIR)para chegar ao caminho de onde você colocou .pcho projeto.

  3. Na opção Configurações de compilação do destino , defina o valor de Precompile Prefix Header como YES.

Yedidya Reiss
fonte
32
Apesar das minhas opiniões sobre arquivos PCH, +1. Ainda é útil que as pessoas saibam como usar as ferramentas.
9138 Rob Napier
20
@ Yedidya, eu só queria agradecer rapidamente por comunicar a resposta à pergunta, apesar dos julgamentos que você tem a respeito. Aprecio quando as pessoas tomam um tempo para responder cordialmente às perguntas, em vez de apenas repreender a pessoa sobre quão mal aconselhada é a pergunta.
campo
3
Obrigado. Acho útil ao incorporar parte do meu Objective-C em um projeto Swift, para que não precise voltar e adicionar vários arquivos de inclusão a cada um desses arquivos .m.
Chris Príncipe
Muito útil ao fazer a transição do ObjC para o Swift - eu tenho várias bibliotecas escritas no ObjC e a última coisa que quero fazer é editar todas elas para incluir os cabeçalhos corretos do sistema.
Echelon
1
Isso não funcionou para mim porque usei as configurações de compilação do destino. No entanto, quando segui estas instruções, modificando as configurações de criação do projeto, tudo funcionou.
Pauls
128

Você precisa criar seu próprio arquivo PCH
AdicionarNew file -> Other-> PCH file

Em seguida, adicione o caminho deste arquivo PCH à sua compilação setting->prefix header->path

($ (SRCROOT) /filename.pch)

insira a descrição da imagem aqui

Prakash Raj
fonte
3
Bem, dependendo do diretório de trabalho, as variáveis ​​podem variar. Estou usando #$(PRODUCT_DIR)/$(PRODUCT_NAME)/PrefixHeader.pch
Alejandro Iván
Se você mantiver o arquivo .pch dentro da pasta específica, ocorreu a situação.
Prakash Raj
51

Eu vou te mostrar uma foto!

  1. Adicionar um novo arquivo Adicionar um novo arquivo

  2. Vá para Projeto / Configuração de compilação / Idioma do APPL LLVM 6.0 Adicionar um novo arquivo

Slemon
fonte
24

Para adicionar arquivo .pch-

1) Adicione um novo arquivo .pch ao seu projeto-> Novo arquivo-> outro-> arquivo PCH

2) Vá para a configuração de compilação do seu projeto.

3) Pesquise "cabeçalho de prefixo". Você pode encontrar isso em Apple LLVM.

4) Cole isso no campo $(SRCROOT)/yourPrefixHeaderFileName.pch

5) Limpe e construa o projeto. É isso aí!!!

insira a descrição da imagem aqui

Subham93
fonte
12

Se você decidir adicionar um arquivo .pch manualmente e quiser usar o Objective-C como antes no xCode 6, também será necessário importar as estruturas UIKit e Foundation no arquivo .pch. Caso contrário, você precisará importar essas estruturas manualmente em cada arquivo de cabeçalho. Você pode adicionar o seguinte código de qualquer maneira, pois ele testa o idioma usado:

#ifdef __OBJC__
    #import <UIKit/UIKit.h>
    #import <Foundation/Foundation.h>
#endif
mgm
fonte
2
Tudo que envolve código ObjC deve ser acondicionada dentro do #ifdef acima _ ObjC _, caso contrário você terá erros de fontes C (no caso de ter tais fontes) que você nunca vai entender
ishahak
7

Usar :

$ (PROJECT_DIR) / Nome do projeto / PrefixHeader.pch

Arash Zeinoddini
fonte
1
Existe algum tipo de declaração $ para "Nome do Projeto" ??
Amit
7

Para adicionar novo arquivo PCH, siga as etapas abaixo:

(1) Adicionar novo visual - selecione iOS - Outro e arquivo PCH

(2) adicione o caminho desse arquivo PCH ao seu projeto - BuildSetting - Apple LLVM 6.0 Language

Adicionar caminho do cabeçalho do prefixo definido Seu Nome da Aplicação (caminho da raiz) / nome do arquivo.pch

Hitesh Vaghela
fonte
Por favor, explique o último. Adicione o caminho do cabeçalho do prefixo definido.
Naveed Abbas