Diferença entre framework e biblioteca estática no xcode4 e como chamá-los

133

Eu sou bastante novo para xcode e objetivo-c. Eu quero fazer uma pergunta muito básica.

Vi que, ao "vincular o binário a bibliotecas" nas configurações do projeto, existem diferenças sobre a estrutura e as bibliotecas, importadas de outros projetos no espaço de trabalho.

Primeira pergunta, por que existe uma estrutura? E por que existe uma biblioteca? Minha biblioteca não pode ser uma estrutura?

E, em um arquivo .h , como posso chamar classes da minha biblioteca estática importada?

Suponho que deve haver um prefixo, mas não o encontrei. Nem "ProjName / Myclass.h" estão funcionando.

Por favor, seja o mais específico possível.

obrigado

Leonardo
fonte
Não uma pergunta básica
Masih

Respostas:

140

A maior vantagem que uma estrutura tem sobre as bibliotecas estáticas é que elas agem como uma maneira pura de empacotar o binário da biblioteca compilada e quaisquer cabeçalhos relacionados. Eles podem ser inseridos no seu projeto (assim como as estruturas internas do SDK, como Foundation e UIKit) e devem funcionar (na maioria das vezes).

A maioria das estruturas contém bibliotecas dinâmicas; estruturas criadas no Xcode usando o modelo do Mac Framework criarão uma biblioteca dinâmica. O iPhone não suporta estruturas dinâmicas, motivo pelo qual se tornou comum que bibliotecas reutilizáveis ​​de código iOS fossem distribuídas como bibliotecas estáticas.

Bibliotecas estáticas são boas, mas requerem um pouco de trabalho extra por parte do usuário. Você precisa vincular seu projeto à biblioteca e copiar os arquivos de cabeçalho no seu projeto ou referenciá-los em algum lugar, definindo os caminhos de pesquisa de cabeçalho apropriados nas configurações de construção.

Então: em resumo, minha opinião é que a melhor maneira de distribuir sua biblioteca é como uma estrutura. Para criar uma estrutura "estática" para iOS, você pode essencialmente usar uma estrutura normal e substituir o binário pela sua biblioteca estática compilada. É assim que distribuo uma de minhas bibliotecas, Resty , e é como pretendo distribuir minhas bibliotecas no futuro.

Você pode querer olhar para o Rakefile fornecido nesse projeto (caso não saiba, Rake é o equivalente a Make de Ruby). Eu tenho várias tarefas para compilar meu projeto (usando xcodebuild) e empacotá-las como uma estrutura estática para iOS. Você deve achar isso útil.

Como alternativa, você pode usar esses modelos do Xcode 4 para criar uma estrutura iOS.

Atualização 9 de dezembro de 2013 : esta é uma resposta popular, por isso pensei em editar para dizer que minha primeira opção para distribuição de bibliotecas mudou. Minha primeira escolha para qualquer biblioteca de terceiros como consumidor ou produtor é o CocoaPods. Eu distribuo minhas bibliotecas usando CocoaPods e ofereço uma biblioteca estática pré-compilada com cabeçalhos como opção de fallback.

Luke Redpath
fonte
1
Portanto, as bibliotecas podem ser estáticas e dinâmicas, e as estruturas são simplesmente um grupo de bibliotecas, que também podem ser dinâmicas ou estáticas, é esse o entendimento correto?
Tony
Parece que o destino da estrutura do Xcode também permite copiar cabeçalhos, mas não agrupar recursos. As bibliotecas estáticas distribuídas também podem conter cabeçalhos?
Tony
Pergunta de acompanhamento: importa se você construiu uma estrutura usando Debug ou Distribution? Porque, caso contrário, a Distribuição tem uma área menor.
Aldrich Co
2
@GoRoS sim, eu faço; na verdade, eu apenas trabalhei para um cliente disponibilizando seu SDK privado usando o CocoaPods. O truque é ter um repositório público com a biblioteca estática compilada, cabeçalhos e podspec apontando para isso e um repositório particular com a sua fonte. Idealmente, você teria algum tipo de IC / automação para verificar seu repo privado, compilar e atualizar seu repo público, mantendo os dois em sincronia. Use tags para marcar as liberações com versão reais no repositório público (e provavelmente no repositório particular também para saber qual confirmação de origem foi usada para criar o release público).
precisa saber é o seguinte
1
@LukeRedpath sua solução com CI parece bastante ideal ... você conhece algum bom artigo / blog com algum tutorial sobre como configurá-lo? Idealmente, com Jenkins
micromanc3r
19

basicamente, estruturas são bibliotecas e fornecem um mecanismo útil para trabalhar com elas. Se você olhar "dentro" de uma estrutura, é apenas um diretório que contém uma biblioteca estática e arquivos de cabeçalho (em alguma estrutura de pastas com metadados).

Se você deseja criar sua própria estrutura, é necessário criar uma "biblioteca estática" e compactá-la de uma maneira específica. veja esta pergunta

Em geral, o framworks em plataformas é usado para comportamento reutilizável, onde você adiciona seu próprio código "em uma estrutura existente". se você quiser ter alguma funcionalidade específica, poderá usar uma biblioteca (por exemplo, three20) e empacotá- la em seu aplicativo distribuível

Martin Ullrich
fonte
1
Observe que não há requisito para que uma estrutura contenha uma biblioteca estática. De fato, no Mac OS X, a maioria das estruturas não contém bibliotecas estáticas - elas contêm bibliotecas dinâmicas.
obrigado, é claro, mas como posso chamar uma classe em uma biblioteca estática de dentro de um arquivo .m? É suficiente chamar #import "MyClass.h", além de adicionar "binários de link com bibliotecas"?
Leonardo
@Bavarious você está certo, eu deveria ter escrito apenas "bibliotecas" ^^; mesmo assim, existe praticamente qualquer estrutura sem bibliotecas - na maioria dos casos, você vincula uma estrutura para compilação e a biblioteca está presente no sistema de destino. Este novo é essa coisa comportamento-vs.-funcionalidade
Martin Ullrich
@ Leonardo sim, basicamente é isso que você tem que fazer. Apenas verifique se os arquivos .h estão em algum lugar do seu caminho. Se você tem o projeto Xcode da libaray, você pode incluir o projeto e seu alvo como uma dependência modo a obter mais recursos de depuração e os .h-arquivos em seu caminho
Martin Ullrich
Estou confuso, achei sua resposta correta, mas a vi marcada como "-1"?!?!?! Segundo, a biblioteca faz parte de um espaço de trabalho e está corretamente vinculada ao projeto principal. Mas ainda estou recebendo "classe não encontrada" na linha '#import "MyClass.h"' ao criar o aplicativo. Eu sei que há um truque para fazê-lo funcionar.
Leonardo