Ответ 1
Важное примечание: Этот ответ был написан до объявления iOS 8. Хотя технические детали все еще применяются к системным рамкам, теперь можно создавать собственные динамически связанные фреймворки, которые поставляются в комплекте приложений. Существуют ограничения, например, только приложение, а его расширения могут ссылаться на один и тот же экземпляр встроенной инфраструктуры, но факт остается фактом, что пользовательская динамически связанная структура возможна с iOS 8. Если вы хотите узнать больше, обратитесь к это руководство (Использование встроенной структуры для совместного использования кода) и сеанс 416 WWDC 2014, построение современных рамок.
Оригинальный ответ: Ни одна из (платформенных) фреймворков действительно "включена в комплект". Вместо этого ваше приложение имеет ссылку ( "ссылка" ) на фреймворк, как только вы добавите его в фазу сборки "Связывание с библиотекой". Рамки предварительно установлены на устройствах. Когда вы запускаете приложение, все ссылки на инфраструктуру приложения разрешаются динамическим компоновщиком (на устройстве), что означает, что код рамки загружен, чтобы ваше приложение могло его использовать.
Некоторые фреймворки могут быть недоступны на всех устройствах, которые вы собираетесь поддерживать, например, PassKit был представлен в iOS 6. Если вы запускаете приложение, которое ссылается на PassKit на устройстве iOS 5, оно выходит из строя сразу после запуска, поскольку динамический компоновщик не может найти структуру на устройстве. Однако, если вы используете слабую ссылку PassKit, динамический компоновщик установит все символы фрейма на nil
, если фреймворк не найден. Это предотвращает сбои приложения, и вы можете проверить наличие символов во время выполнения, например:
if ([PKPass class]) {
// Class is available - use it
PKPass *pass = [[PKPass alloc] init];
}
[PKPass class]
безопасен для использования на всех устройствах/системах, поскольку символ PKPass
будет nil
в старых системах, а обмен сообщениями nil
не является проблемой в Objective-C.
Подробнее о слабых связях: Документация Apple
Чтобы действительно ответить на ваш вопрос:
Означает ли это, что фреймворк включен только в комплект, когда он где-то импортирован?
Нет. Структура всегда будет связана с приложением. Только когда фреймворк не найден на самом устройстве, на котором работает ваше приложение, фреймворк не будет загружен.
Одним из решений было бы иметь отдельные цели для отладки и сборки хранилища приложений. Альтернатива заключается в том, чтобы не использовать встроенную фазу сборки Link Binary with Library из Xcode, но для связывания фреймворков Debug с параметрами компоновщика. Они могут быть указаны для каждой конфигурации (Debug/Release/...) отдельно, например:
Если вы хотите использовать слабую ссылку, используйте -weak_framework PassKit
(PassKit, конечно, просто пример здесь... вставьте имя вашей фреймворка). Если ваша структура Debug не входит в одну из каталогов фреймов по умолчанию, вам может потребоваться полный путь или изменить путь поиска Framework. Кроме того, вы должны, вероятно, использовать макросы, чтобы убедиться, что ни один из кода, использующий рамки отладки, не попадает в сборку App Store.
Изменить. Еще одна опция, поскольку Xcode 5 использует @import <FrameworkName>;
. Таким образом, вы можете оставить фазу "Link Binary..." пустой и инициировать связывание фреймворков в коде. Затем вы можете использовать макросы, такие как DEBUG
, чтобы убедиться, что некоторые фреймворки не используются для сборки App Store. Там отличный ответ относительно @import
.