Différence entre le framework et la bibliothèque statique dans xcode4 et comment les appeler

133

Je suis assez nouveau sur xcode et objective-c. Je veux poser une question très fondamentale.

J'ai vu que lors de la "liaison du binaire aux bibliothèques" dans les paramètres du projet, il existe des différences sur le cadre et les bibliothèques, importées d'autres projets dans l'espace de travail.

Première question, pourquoi y a-t-il un cadre? Et pourquoi y a-t-il une bibliothèque? Ma bibliothèque ne peut-elle pas être un framework?

Et puis, à partir d'un fichier .h , comment puis-je appeler des classes depuis ma bibliothèque statique importée?

Je suppose qu'il doit y avoir un préfixe, mais je ne l'ai pas trouvé. Ni "ProjName / Myclass.h" ne fonctionnent.

Veuillez être aussi précis que possible.

Merci

Léonard
la source
Pas une question de base
Masih

Réponses:

140

Le plus grand avantage d'un framework par rapport aux bibliothèques statiques est qu'ils agissent comme un moyen efficace d'empaqueter le binaire de la bibliothèque compilée et tous les en-têtes associés. Ils peuvent être déposés dans votre projet (tout comme les frameworks intégrés du SDK tels que Foundation et UIKit) et ils devraient simplement fonctionner (la plupart du temps).

La plupart des frameworks contiennent des bibliothèques dynamiques; les frameworks créés dans Xcode à l'aide du modèle Mac Framework créeront une bibliothèque dynamique. L'iPhone ne prend pas en charge les frameworks dynamiques, c'est pourquoi il est devenu courant que les bibliothèques réutilisables de code iOS soient plutôt distribuées sous forme de bibliothèques statiques.

Les bibliothèques statiques sont bien, mais elles nécessitent un peu de travail supplémentaire de la part de l'utilisateur. Vous devez lier votre projet à la bibliothèque et vous devez copier les fichiers d'en-tête dans votre projet ou les référencer quelque part en définissant les chemins de recherche d'en-tête appropriés dans vos paramètres de construction.

Donc: en résumé, mon avis est que la meilleure façon de distribuer votre bibliothèque est en tant que framework. Pour créer un framework "statique" pour iOS, vous pouvez essentiellement prendre un framework normal et remplacer le binaire par votre bibliothèque statique compilée. C'est ainsi que je distribue l'une de mes bibliothèques, Resty et c'est ainsi que j'ai l'intention de distribuer mes bibliothèques à l'avenir.

Vous voudrez peut-être regarder le Rakefile fourni dans ce projet (au cas où vous ne le sauriez pas, Rake est l'équivalent Ruby de Make). J'ai une poignée de tâches pour compiler mon projet (en utilisant xcodebuild) et les empaqueter en tant que cadre statique pour iOS. Vous devriez trouver cela utile.

Vous pouvez également utiliser ces modèles Xcode 4 pour créer un framework iOS.

Mise à jour du 9 décembre 2013 : c'est une réponse populaire, j'ai donc pensé modifier pour dire que mon premier choix pour la distribution de la bibliothèque a changé. Mon premier choix pour toute bibliothèque tierce en tant que consommateur ou producteur est CocoaPods. Je distribue mes bibliothèques à l'aide de CocoaPods et propose une bibliothèque statique précompilée avec des en-têtes comme option de secours.

Luke Redpath
la source
1
Ainsi, les bibliothèques peuvent être statiques et dynamiques, et les frameworks sont simplement un groupe de bibliothèques, qui peuvent également être dynamiques ou statiques, est-ce la bonne compréhension?
Tony
Il semble que la cible du framework Xcode vous permette également de copier des en-têtes, mais pas de regrouper des ressources. Les bibliothèques statiques distribuées peuvent-elles également contenir des en-têtes?
Tony
Question de suivi: est-ce important que vous ayez construit un framework en utilisant Debug ou Distribution? Car sinon Distribution a une empreinte plus petite.
Aldrich Co
2
@GoRoS oui je fais; en fait, je viens de travailler pour un client rendant son SDK privé disponible à l'aide de CocoaPods. L'astuce consiste à avoir un dépôt public avec la bibliothèque statique compilée, les en-têtes et le podspec pointant vers cela et un dépôt privé avec votre source. Idéalement, vous auriez une sorte de CI / automatisation pour vérifier votre dépôt privé, compiler et mettre à jour votre dépôt public, en gardant les deux synchronisés. Utilisez des balises pour baliser les versions versionnées réelles dans le référentiel public (et probablement aussi dans le référentiel privé afin de savoir quelle validation source a été utilisée pour créer la version publique).
Luke Redpath
1
@LukeRedpath votre solution avec CI semble assez idéale ... connaissez-vous un bon article / blog avec un tutoriel sur la façon de le configurer? Idéalement avec Jenkins
micromanc3r
19

fondamentalement, les frameworks SONT des bibliothèques et fournissent un mécanisme pratique pour travailler avec eux. Si vous regardez "à l'intérieur" d'un framework, c'est juste un répertoire contenant une bibliothèque statique et des fichiers d'en-tête (dans une structure de dossiers avec des métadonnées).

Si vous voulez créer votre propre framework, vous devez créer une "bibliothèque statique" et la conditionner d'une manière spécifique. voir cette question

En général, les framworks sur les plates-formes sont utilisés pour un comportement réutilisable où vous ajoutez votre propre code "dans un cadre existant". si vous souhaitez avoir des fonctionnalités spécifiques, vous pouvez utiliser une bibliothèque (par exemple, three20) et la mettre dans votre application distribuable

Martin Ullrich
la source
1
Notez qu'il n'est pas nécessaire qu'un framework contienne une bibliothèque statique. En fait, sur Mac OS X, la plupart des frameworks ne contiennent pas de bibliothèques statiques - ils contiennent des bibliothèques dynamiques à la place.
merci c'est clair, mais comment puis-je appeler une classe dans une bibliothèque statique à partir d'un fichier .m? Est-il suffisant d'appeler #import "MyClass.h", en plus d'ajouter des "binaires de lien avec des bibliothèques"?
Leonardo
@Bavarious vous avez raison, je n'aurais dû écrire que des "bibliothèques" ^^; Pourtant, il existe presque tous les frameworks sans bibliothèques - dans la plupart des cas, vous établissez un lien avec un framework pour la compilation et la bibliothèque est présente sur le système cible. c'est encore cette chose de comportement contre fonctionnalité
Martin Ullrich
@Leonardo oui, c'est essentiellement ce que vous devez faire. Assurez-vous simplement que les fichiers .h sont quelque part dans votre chemin. Si vous avez le projet XCode de la libaray, vous pouvez inclure le projet et sa cible en tant que dépendance afin d'obtenir plus de fonctionnalités de débogage et les fichiers .h dans votre chemin
Martin Ullrich
Je suis confus, j'ai pensé que votre réponse était correcte, mais je l'ai vu marqué comme "-1"?!?!?! Deuxièmement, la bibliothèque fait partie d'un espace de travail et est correctement liée à partir du projet principal. Mais j'obtiens toujours "class not found" à la ligne '#import "MyClass.h"' lors de la construction de l'application. Je sais qu'il existe une astuce pour que cela fonctionne.
Leonardo