Разница между фреймворком и статической библиотекой в ​​xcode4 и как их называть

133

Я совершенно новичок в Xcode и Objective-C. Я хочу задать очень простой вопрос.

Я видел, что при «связывании двоичного файла с библиотеками» в настройках проекта есть различия в фреймворке и библиотеках, импортированных из других проектов в рабочей области.

Первый вопрос, почему есть рамки? И почему там библиотека? Моя библиотека не может быть фреймворком?

И затем, из файла .h , как я могу вызвать классы из моей импортированной статической библиотеки?

Я предполагаю, что должен быть префикс, но я не смог его найти. Ни «ProjName / Myclass.h» не работают.

Пожалуйста, будьте как можно точнее.

Спасибо

Leonardo
источник
Не основной вопрос
Масих

Ответы:

140

Самым большим преимуществом фреймворка перед статическими библиотеками является то, что они действуют как аккуратный способ упаковки скомпилированного двоичного файла библиотеки и любых связанных заголовков. Они могут быть добавлены в ваш проект (так же, как встроенные фреймворки SDK, такие как Foundation и UIKit), и они должны просто работать (большую часть времени).

Большинство фреймворков содержат динамические библиотеки; рамки, созданные в Xcode с использованием шаблона Mac Framework, создадут динамическую библиотеку. IPhone не поддерживает динамические фреймворки, поэтому многоразовые библиотеки кода iOS стали распространяться в виде статических библиотек.

Статические библиотеки хороши, но они требуют немного дополнительной работы со стороны пользователя. Вы должны связать свой проект с библиотекой, и вам нужно скопировать файлы заголовков в ваш проект или сослаться на них где-нибудь, указав соответствующие пути поиска заголовков в настройках сборки.

Итак, в общем, я считаю, что лучший способ распространения вашей библиотеки - это фреймворк. Чтобы создать «статический» фреймворк для iOS, вы можете по существу взять обычный фреймворк и заменить двоичный файл скомпилированной статической библиотекой. Вот как я распространяю одну из моих библиотек, Resty и именно так я намерен распространять свои библиотеки в будущем.

Вы можете посмотреть Rakefile, поставляемый в этом проекте (если вы не знаете, Rake - это Ruby-эквивалент Make). У меня есть несколько задач для компиляции моего проекта (использования xcodebuild) и упаковки их в качестве статической среды для iOS. Вы найдете это полезным.

Кроме того, вы можете использовать эти шаблоны Xcode 4 для создания платформы iOS.

Обновление 9 декабря 2013 года : это популярный ответ, поэтому я решил отредактировать его, сказав, что мой первый выбор для распространения библиотеки изменился. Мой первый выбор для любой сторонней библиотеки в качестве потребителя или производителя - CocoaPods. Я распространяю свои библиотеки с помощью CocoaPods и предлагаю предварительно скомпилированную статическую библиотеку с заголовками в качестве запасного варианта.

Люк Редпат
источник
1
Таким образом, библиотеки могут быть статическими и динамическими, а фреймворки - это просто группа библиотек, которые также могут быть динамическими или статическими, это правильное понимание?
Тони
Похоже, что цель платформы Xcode также позволяет копировать заголовки, но не связывать ресурсы. Могут ли распределенные статические библиотеки содержать заголовки?
Тони
Последующий вопрос: имеет ли значение, если вы построили фреймворк с использованием Debug или Distribution? Потому что в противном случае дистрибуция имеет меньшую площадь.
Aldrich Co
2
@GoRoS да, я делаю; на самом деле я только что поработал для клиента, сделав доступным их частный SDK с помощью CocoaPods. Хитрость заключается в том, чтобы иметь общедоступное репо со скомпилированной статической библиотекой, заголовками и podspec, указывающими на это, и частное репо с вашим источником. В идеале у вас должен быть какой-то CI / автоматизация для проверки вашего частного репо, компиляции и обновления публичного репо, синхронизируя их. Используйте теги, чтобы пометить актуальные выпуски с поддержкой версий в общедоступном репо (и, возможно, в частном репо, чтобы вы знали, какой исходный коммит использовался для создания общедоступного выпуска).
Люк Редпат
1
@LukeRedpath ваше решение с CI звучит довольно идеально ... знаете ли вы о какой-нибудь хорошей статье / блоге с учебником, как его настроить? Идеально с Дженкинсом
micromanc3r
19

В основном, фреймворки являются библиотеками и предоставляют удобный механизм для работы с ними. Если вы посмотрите «внутрь» фреймворка, это просто каталог, содержащий статическую библиотеку и файлы заголовков (в некоторой структуре папок с метаданными).

Если вы хотите создать свой собственный фреймворк, вы должны создать «статическую библиотеку» и упаковать ее особым образом. увидеть этот вопрос

В общем, framworks на платформах используется для многоразового поведения, когда вы добавляете свой собственный код «в существующую среду». если вы хотите иметь определенную функциональность, вы можете использовать библиотеку (например, three20) и упаковать ее в свой дистрибутив приложения

Мартин Ульрих
источник
1
Обратите внимание, что нет требования, чтобы фреймворк содержал статическую библиотеку. Фактически, в Mac OS X большинство фреймворков не содержат статических библиотек - вместо этого они содержат динамические библиотеки.
спасибо, это понятно, но как я могу вызвать класс в статической библиотеке из файла .m? Достаточно ли вызвать #import "MyClass.h", кроме добавления в "связать двоичные файлы с библиотеками"?
Леонардо
@Bavarious, вы правы, я должен был написать только "библиотеки" ^^; тем не менее, существует почти любая инфраструктура без библиотек - в большинстве случаев вы ссылаетесь на платформу для компиляции, и библиотека присутствует в целевой системе. это опять-таки такая штука с поведением и функциональностью
Мартин Уллрих,
@ Леонардо, да, в основном это то, что ты должен сделать. Просто убедитесь, что файлы .h находятся где-то на вашем пути. Если у вас есть XCode-проект библиотеки, вы можете включить проект и его цель в качестве зависимости, чтобы получить больше возможностей отладки и .h-файлов на своем пути
Martin Ullrich
Я в замешательстве, я думал, что ваш ответ был правильным, но я увидел, что он помечен как "-1"?!?!?! Во-вторых, библиотека является частью рабочей области и правильно связана с основным проектом. Но я все еще получаю сообщение «класс не найден» в строке «#import« MyClass.h »» при создании приложения. Я знаю, что есть трюк, чтобы заставить его работать.
Леонардо