Diferencia entre framework y biblioteca estática en xcode4, y cómo llamarlos

133

Soy bastante nuevo en xcode y Objective-c. Quiero hacer una pregunta muy básica.

Vi que cuando se "vincula binario a bibliotecas" en la configuración del proyecto, hay diferencias sobre el marco y las bibliotecas, importadas de otros proyectos en el espacio de trabajo.

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

Y luego, desde 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" están funcionando.

Por favor se tan especifico como puedas.

Gracias

Leonardo
fuente
No es una pregunta básica
Masih

Respuestas:

140

La mayor ventaja que tiene un marco sobre las bibliotecas estáticas es que actúan como una forma ordenada de empaquetar el binario compilado de la biblioteca y cualquier encabezado relacionado. Pueden incluirse en su proyecto (al igual que los marcos integrados del SDK como Foundation y UIKit) y deberían funcionar (la mayoría de las veces).

La mayoría de los marcos contienen bibliotecas dinámicas; Los frameworks creados en Xcode usando la plantilla Mac Framework crearán una biblioteca dinámica. El iPhone no admite marcos dinámicos, por lo que se ha vuelto 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 referencia a ellos en algún lugar configurando las rutas de búsqueda de encabezado adecuadas en la configuración de compilación.

Entonces: en resumen, mi opinión es que la mejor manera de distribuir su biblioteca es como un marco. Para crear un marco "estático" para iOS, esencialmente 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 así es como pretendo distribuir mis bibliotecas en el futuro.

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

Alternativamente, es posible que desee utilizar estas plantillas Xcode 4 para crear un marco iOS.

Actualización 9 de diciembre de 2013 : esta es una respuesta popular, así que pensé en 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.

Luke Redpath
fuente
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 esa la comprensión correcta?
Tony
Parece que el objetivo del marco Xcode también le permite copiar encabezados, pero no agrupar recursos. ¿Las bibliotecas estáticas distribuidas también pueden contener encabezados?
Tony
Pregunta de seguimiento: ¿importa si ha creado un marco utilizando Debug o Distribution? Porque de lo contrario, la distribución tiene una huella más pequeña.
Aldrich Co
2
@GoRoS sí, lo hago; de hecho, acabo de trabajar para un cliente que hace que su SDK privado esté disponible usando CocoaPods. El truco consiste en tener un repositorio público con la biblioteca estática compilada, los encabezados y el podspec apuntando a esto y un repositorio privado con su fuente. Lo ideal sería tener algún tipo de CI / automatización para verificar su repositorio privado, compilar y actualizar su repositorio público, manteniendo los dos sincronizados. Use etiquetas para etiquetar versiones versionadas reales en el repositorio público (y probablemente también en el repositorio privado para saber qué confirmación de origen se utilizó para crear la versión pública).
Luke Redpath
1
@LukeRedpath, su solución con CI suena bastante ideal ... ¿conoce algún buen artículo / blog con algún tutorial sobre cómo configurarlo? Idealmente con Jenkins
micromanc3r
19

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

Si desea crear su propio marco, debe crear una "biblioteca estática" y empaquetarla de una manera específica. ver esta pregunta

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

Martin Ullrich
fuente
1
Tenga en cuenta que no existe el requisito de que un marco debe contener una biblioteca estática. De hecho, en Mac OS X, la mayoría de los marcos no contienen bibliotecas estáticas, sino bibliotecas dinámicas.
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 "vincular binarios con bibliotecas"?
Leonardo
@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. esto nuevamente es esto de comportamiento versus funcionalidad
Martin Ullrich
@Leonardo sí, básicamente eso es lo que tienes que hacer. Solo asegúrese de que los archivos .h estén en algún lugar de su camino. Si tiene el proyecto XCode del libaray, puede incluir el proyecto y su destino como una dependencia para obtener más funciones de depuración y los archivos .h en su camino
Martin Ullrich
Estoy confundido, pensé que su respuesta era correcta, pero la vi marcada como "-1"?!?!?! En segundo lugar, la biblioteca es parte de un espacio de trabajo y está correctamente vinculada desde el proyecto principal. Pero sigo obteniendo "clase no encontrada" en la línea '#import "MyClass.h"' al compilar la aplicación. Sé que hay un truco para que funcione.
Leonardo