2011-06-05 14 views
125

Soy bastante nuevo en xcode y objetivo-c. Quiero hacer una pregunta muy básica.Diferencia entre framework y biblioteca estática en xcode4, y cómo llamarlos

Vi que al "vincular binarios a bibliotecas" en la configuración del proyecto, existen diferencias sobre el marco y las bibliotecas, importadas de otros proyectos en el área de trabajo.

Primera pregunta, ¿por qué hay un marco? ¿Y por qué hay una biblioteca? ¿No puede mi biblioteca ser un marco?

Y luego, de un archivo .h, ¿cómo puedo llamar a clases desde mi biblioteca estática importada?

Supongo que debe haber un prefijo, pero no pude encontrarlo. Ni "ProjName/Myclass.h" ni están funcionando.

Por favor, sea tan específico como pueda.

Gracias

Respuesta

136

La mayor ventaja que tiene un framework sobre las bibliotecas estáticas es que actúan de una manera ordenada de empaquetar el binario de la biblioteca compilada y los encabezados relacionados. Se pueden soltar en su proyecto (al igual que los marcos incorporados del SDK como Foundation y UIKit) y simplemente deberían funcionar (la mayoría de las veces).

La mayoría de los marcos contienen bibliotecas dinámicas; los marcos creados en Xcode con la plantilla de Mac Framework crearán una biblioteca dinámica. El iPhone no es compatible con marcos dinámicos, razón por la cual es común que las bibliotecas reutilizables de código iOS se distribuyan como bibliotecas estáticas.

Las bibliotecas estáticas están bien, pero requieren un poco de trabajo extra por parte del usuario. Debe vincular su proyecto a la biblioteca y debe copiar los archivos de encabezado en su proyecto o hacer referencia a ellos en algún lugar estableciendo las rutas de búsqueda de encabezado adecuadas en su configuración de compilación.

Así que, en resumen, mi opinión es que la mejor forma de distribuir tu biblioteca es como marco. Para crear un marco "estático" para iOS, básicamente puede tomar un marco normal y reemplazar el binario con su biblioteca estática compilada. Así es como distribuyo una de mis bibliotecas, Resty y es la forma en que pretendo distribuir mis bibliotecas en el futuro.

Es posible que desee ver el archivo Rakefile incluido en ese proyecto (en caso de que no lo sepa, Rake es el equivalente de Ruby de Make). Tengo un puñado de tareas para compilar mi proyecto (usando xcodebuild) y empaquetarlas como un marco estático para iOS. Deberías encontrar esto útil.

Como alternativa, puede usar these Xcode 4 templates para crear un marco de iOS.

Actualización 9 de diciembre 2013: esta es una respuesta popular, así que pensé que iba a editar para decir que mi primera opción para la distribución de la biblioteca ha cambiado. Mi primera opción para cualquier biblioteca de terceros como consumidor o productor es CocoaPods. Distribuyo mis bibliotecas usando CocoaPods y ofrezco una biblioteca estática precompilada con encabezados como opción alternativa.

+1

Entonces, las bibliotecas pueden ser estáticas y dinámicas, y los marcos son simplemente un grupo de bibliotecas, que también pueden ser dinámicas o estáticas, ¿es eso lo que se entiende correctamente? – Tony

+0

Parece que el objetivo de Xcode framework también le permite copiar encabezados, pero no agrupar recursos. ¿Las bibliotecas estáticas distribuidas también pueden contener encabezados? – Tony

+0

Pregunta de seguimiento: ¿Importa si hubiera construido un marco utilizando Debug o Distribution? Porque de lo contrario la distribución tiene una huella más pequeña. –

19

básicamente, marcos SON bibliotecas y proporcionan un mecanismo útil para trabajar con ellos. Si mira "dentro" de un marco, es solo un directorio que contiene una biblioteca estática y archivos de encabezado (en alguna estructura de carpeta con metadatos).

Si desea crear su propio marco, debe crear una "biblioteca estática" y empacarla de una manera específica. ver this question

En general, los marcos en las plataformas se utilizan para el comportamiento reutilizable donde agrega su propio código "en un marco existente". si desea tener alguna funcionalidad específica, puede usar una biblioteca (por ejemplo, three20) y empacarla en su aplicación distribuible

+1

Tenga en cuenta que no es necesario que una infraestructura contenga una biblioteca estática. De hecho, en Mac OS X, la mayoría de los marcos no contienen bibliotecas estáticas, sino que contienen bibliotecas dinámicas. –

+0

gracias, está claro, pero ¿cómo puedo llamar a una clase en una biblioteca estática desde un archivo .m? ¿Es suficiente llamar a #import "MyClass.h", además de agregar "enlaces binarios con bibliotecas"? – Leonardo

+0

@Bavarious tienes razón, debería haber escrito solo "bibliotecas" ^^; aún así, existe casi cualquier marco sin bibliotecas: en la mayoría de los casos, se vincula con un marco para compilar y la biblioteca está presente en el sistema de destino. De nuevo, esta es la característica de comportamiento frente a la funcionalidad –

Cuestiones relacionadas