Estou brincando com alguns dos novos recursos do iOS 7 e trabalhando com alguns dos Efeitos de imagem, conforme discutido no vídeo da WWDC "Implementando a interface do usuário envolvente no iOS". Para produzir um efeito de desfoque no código fonte da sessão, UIImage
foi estendido por meio de uma categoria que importa o UIKit da seguinte forma:
@import UIKit;
Acho que vi algo sobre isso em outro vídeo da sessão, mas estou tendo problemas para encontrá-lo. Estou procurando informações sobre quando usar isso. Só pode ser usado com estruturas da Apple? Os benefícios de usar essa diretiva de compilador são suficientes para eu voltar e atualizar o código antigo?
ios
objective-c
import
ios7
jamdaddy25
fonte
fonte
Respostas:
É um novo recurso chamado Módulos ou "importação semântica". Há mais informações nos vídeos da WWDC 2013 para as sessões 205 e 404 . É uma espécie de melhor implementação dos cabeçalhos pré-compilados. Você pode usar módulos com qualquer uma das estruturas do sistema no iOS 7 e no Mavericks. Os módulos são um empacotamento junto do executável da estrutura e seus cabeçalhos e são apontados como mais seguros e eficientes do que
#import
.Uma das grandes vantagens do uso
@import
é que você não precisa adicionar a estrutura nas configurações do projeto, isso é feito automaticamente . Isso significa que você pode pular a etapa em que clica no botão de adição e procurar a estrutura (caixa de ferramentas dourada) e movê-la para o grupo "Estruturas". Ele salvará muitos desenvolvedores das mensagens enigmáticas "Erro do vinculador".Na verdade, você não precisa usar a
@import
palavra - chave. Se você optar por usar os módulos, todas as diretivas#import
e#include
serão mapeadas para uso@import
automático. Isso significa que você não precisa alterar seu código-fonte (ou o código-fonte das bibliotecas que você baixa de outro local). Supostamente, o uso de módulos também melhora o desempenho da compilação, especialmente se você não estiver usando bem as PCHs ou se o seu projeto tiver muitos arquivos de origem pequenos.Os módulos são pré-criados para a maioria das estruturas da Apple (UIKit, MapKit, GameKit, etc.). Você pode usá-los com estruturas criadas por você mesmo: elas são criadas automaticamente se você criar uma estrutura Swift no Xcode e criar manualmente manualmente um arquivo ".modulemap" para qualquer biblioteca da Apple ou de terceiros .
Você pode usar o preenchimento de código para ver a lista de estruturas disponíveis:
Os módulos são ativados por padrão em novos projetos no Xcode 5 . Para habilitá-los em um projeto mais antigo, entre nas configurações de construção do seu projeto, pesquise "Módulos" e defina "Ativar Módulos" como "SIM". Os "Link Frameworks" também devem ser "YES":
É necessário usar o Xcode 5 e o iOS 7 ou o Mavericks SDK, mas ainda é possível lançar para sistemas operacionais mais antigos (por exemplo, iOS 4.3 ou o que for). Os módulos não alteram a forma como seu código é criado ou o código fonte.
Nos slides da WWDC:
Para usar explicitamente os módulos:
Substitua
#import <Cocoa/Cocoa.h>
por@import Cocoa;
Você também pode importar apenas um cabeçalho com esta notação:
Os submódulos são preenchidos automaticamente para você no Xcode.
fonte
@import sqlite3
funcionou para mim porque eu criei meu próprio module.map para ele e quando percebi que o sqlite foi incluído no OS X e removi o module.map, o compilador continuou usando o módulo obsoleto.Boa resposta que você pode encontrar no livro Learning Cocoa with Objective-C (ISBN: 978-1-491-90139-7)
Os módulos são um novo meio de incluir e vincular arquivos e bibliotecas em seus projetos. Para entender como os módulos funcionam e quais benefícios eles têm, é importante relembrar o histórico do Objective-C e a instrução #import Sempre que você desejar incluir um arquivo para uso, geralmente haverá um código semelhante a este:
Ou no caso de frameworks:
Como o Objective-C é um superconjunto da linguagem de programação C, a declaração #import é um refinamento menor na
#include
declaração de C. A instrução #include é muito simples; copia tudo o que encontra no arquivo incluído no seu código durante a compilação. Às vezes, isso pode causar problemas significativos. Por exemplo, imagine que você tenha dois arquivos de cabeçalho:SomeFileA.h
eSomeFileB.h
;SomeFileA.h
incluiSomeFileB.h
eSomeFileB.h
incluiSomeFileA.h
. Isso cria um loop e pode confundir o coimpiler. Para lidar com isso, os programadores C precisam escrever proteções contra esse tipo de evento.Ao usar
#import
, você não precisa se preocupar com esse problema ou escrever protetores de cabeçalho para evitá-lo. No entanto,#import
ainda é apenas uma ação gloriosa de copiar e colar, causando um tempo de compilação lento entre uma série de outros problemas menores, mas ainda muito perigosos (como um arquivo incluído substituindo algo que você declarou em outro lugar no seu próprio código).Módulos são uma tentativa de contornar isso. Eles não são mais um copiar e colar no código fonte, mas uma representação serializada dos arquivos incluídos que podem ser importados para o código-fonte somente quando e onde forem necessários. Usando módulos, o código geralmente compila mais rápido e é mais seguro do que usar #include ou
#import
.Retornando ao exemplo anterior de importação de uma estrutura:
Para importar esta biblioteca como um módulo, o código seria alterado para:
Isso tem o bônus adicional do Xcode vinculando a estrutura SomeLibrary ao projeto automaticamente. Os módulos também permitem incluir apenas os componentes que você realmente precisa em seu projeto. Por exemplo, se você quiser usar o componente AwesomeObject na estrutura AwesomeLibrary, normalmente precisará importar tudo apenas para usar a peça única. No entanto, usando módulos, você pode apenas importar o objeto específico que deseja usar:
Para todos os novos projetos feitos no Xcode 5, os módulos são ativados por padrão. Se você quiser usar módulos em projetos mais antigos (e realmente deve), eles deverão ser ativados nas configurações de compilação do projeto. Depois de fazer isso, você pode usar as instruções
#import
e@import
no seu código juntas sem nenhuma preocupação.fonte
Atualmente, ele funciona apenas para as estruturas de sistema integradas. Se você usar
#import
como a apple ainda importando aUIKit
estrutura no delegado do aplicativo, ela será substituída (se os módulos estiverem ativados e for reconhecida como uma estrutura do sistema) e o compilador fará o remapeamento para que seja uma importação de módulo e não uma importação dos arquivos de cabeçalho de qualquer maneira . Portanto, deixar o#import
será igual ao convertido para uma importação de módulo sempre que possívelfonte
Parece que desde o XCode 7.xa muitos avisos são lançados ao ativar o módulo clang com
CLANG_ENABLE_MODULES
Dê uma olhada em muitos avisos ao criar com o Xcode 7 com bibliotecas de terceiros
fonte
Existem alguns benefícios do uso de módulos. Você pode usá-lo apenas com a estrutura da Apple, a menos que o mapa do módulo seja criado.
@import
é um pouco semelhante à pré-compilação de arquivos de cabeçalhos quando adicionados ao.pch
arquivo, que é uma maneira de ajustar o aplicativo ao processo de compilação. Além disso, você não precisa adicionar bibliotecas da maneira antiga, o uso@import
é muito mais rápido e eficiente. Se você ainda procura uma boa referência, recomendo que você leia este artigo .fonte
História:
#include vs #import
.pch - Cabeçalho pré-compilado
Módulo -
@import
@module
declaração diz ao compilador para carregar um binário pré - compilado da estrutura que diminui o tempo de construção . O Framework modular contém.modulemap
[Sobre]Se o recurso do módulo estiver ativado no projeto Xcode
#include
e as#import
diretivas forem convertidas automaticamente,@import
isso traz todas as vantagensfonte