@import vs #import - iOS 7

Я играю с некоторыми новыми функциями iOS 7 и работаю с некоторыми графическими эффектами, которые обсуждались в видеоролике WWDC "Внедрение привлекательного пользовательского интерфейса на iOS". Для создания эффекта размытия в исходном коде для сеанса, UIImage был расширен через категорию, которая импортирует UIKit следующим образом:

@import UIKit;

Я думаю, что видел что-то об этом в другом видео сеанса, но у меня проблемы с поиском. Я ищу любую справочную информацию о том, когда использовать это. Может ли он использоваться только с фреймворками Apple? Достаточно ли преимуществ использования этой директивы компилятора, чтобы я мог вернуться и обновить старый код?

5 ответов

Решение

Это новая функция под названием Модули или "семантический импорт". Больше информации в видео WWDC 2013 для сессий 205 и 404. Это своего рода лучшая реализация предварительно скомпилированных заголовков. Вы можете использовать модули с любой из системных платформ в iOS 7 и Mavericks. Модули представляют собой совокупность исполняемого файла платформы и его заголовков и рекламируются как более безопасные и эффективные, чем #import,

Одно из больших преимуществ использования @import в том, что вам не нужно добавлять фреймворк в настройках проекта, это делается автоматически. Это означает, что вы можете пропустить шаг, на котором вы нажимаете кнопку "плюс" и ищите каркас (золотой набор инструментов), а затем перемещаете его в группу "Каркасы". Это спасет многих разработчиков от загадочных сообщений об ошибках компоновщика.

Вам на самом деле не нужно использовать @import ключевое слово. Если вы решите использовать модули, все #import а также #include директивы отображаются для использования @import автоматически. Это означает, что вам не нужно менять исходный код (или исходный код библиотек, которые вы загружаете из других источников). Предположительно, использование модулей также повышает производительность сборки, особенно если вы плохо используете PCH или если в вашем проекте много небольших исходных файлов.

Модули предварительно созданы для большинства платформ Apple (UIKit, MapKit, GameKit и т. Д.). Вы можете использовать их с фреймворками, которые вы создаете сами: они создаются автоматически, если вы создаете фреймворк Swift в XCode, и вы можете вручную создать файл ".modulemap" для любой библиотеки Apple или сторонней библиотеки.

Вы можете использовать завершение кода, чтобы увидеть список доступных платформ:

Модули включены по умолчанию в новых проектах в Xcode 5. Чтобы включить их в более старом проекте, зайдите в настройки сборки вашего проекта, найдите "Модули" и установите "Включить модули" в "ДА". "Рамки ссылок" также должны быть "ДА":

Вы должны использовать Xcode 5 и iOS 7 или Mavericks SDK, но вы все еще можете выпустить для более старых ОС (скажем, iOS 4.3 или что-то еще). Модули не меняют способ построения вашего кода или какого-либо исходного кода.


Из слайдов WWDC:

  • Импортирует полное семантическое описание фреймворка
  • Не нужно разбирать заголовки
  • Лучший способ импортировать интерфейс фреймворка
  • Загружает двоичное представление
  • Более гибкий, чем предварительно скомпилированные заголовки
  • Невосприимчив к воздействию локальных макроопределений (например, #define readonly 0x01)
  • По умолчанию включено для новых проектов

Чтобы явно использовать модули:

замещать #import <Cocoa/Cocoa.h> с @import Cocoa;

Вы также можете импортировать только один заголовок с этой нотацией:

@import iAd.ADBannerView;

Субмодули автоматически заполняются для вас в Xcode.

Хороший ответ вы можете найти в книге "Изучение какао с Objective-C" (ISBN: 978-1-491-90139-7)

Модули - это новое средство включения и связывания файлов и библиотек в ваши проекты. Чтобы понять, как работают модули и какие у них есть преимущества, важно оглянуться на историю Objective-C и оператора #import. Когда бы вы ни захотели включить файл для использования, у вас обычно будет какой-то код, который выглядит следующим образом:

#import "someFile.h"

Или в случае рамок:

#import <SomeLibrary/SomeFile.h>

Поскольку Objective-C является надмножеством языка программирования C, утверждение #import является незначительным уточнением для C #include заявление. Утверждение #include очень просто; он копирует все, что находит во включенном файле, в ваш код во время компиляции. Иногда это может вызвать серьезные проблемы. Например, представьте, что у вас есть два заголовочных файла: SomeFileA.h а также SomeFileB.h; SomeFileA.h включает в себя SomeFileB.h, а также SomeFileB.h включает в себя SomeFileA.h, Это создает цикл и может запутать coimpiler. Чтобы справиться с этим, программисты на Си должны написать защиту от такого типа событий.

Когда используешь #importВам не нужно беспокоиться об этой проблеме или писать заголовки, чтобы избежать ее. Тем не мение, #import это все еще просто прославленное действие копирования и вставки, вызывающее медленное время компиляции среди множества других небольших, но все же очень опасных проблем (таких как включенный файл, переопределяющий то, что вы объявили в другом месте своего собственного кода).

Модули - это попытка обойти это. Они больше не являются копией и вставкой в ​​исходный код, а представляют собой сериализованное представление включенных файлов, которые могут быть импортированы в ваш исходный код только тогда и там, где они необходимы. При использовании модулей код, как правило, компилируется быстрее и безопаснее, чем с помощью #include или #import,

Возвращаясь к предыдущему примеру импорта фреймворка:

#import <SomeLibrary/SomeFile.h>

Чтобы импортировать эту библиотеку как модуль, код будет изменен на:

@import SomeLibrary;

Это имеет дополнительный бонус Xcode, автоматически связывающий платформу SomeLibrary с проектом. Модули также позволяют включать в проект только те компоненты, которые вам действительно нужны. Например, если вы хотите использовать компонент AwesomeObject в платформе AwesomeLibrary, обычно вам придется импортировать все, чтобы использовать только один компонент. Однако, используя модули, вы можете просто импортировать конкретный объект, который вы хотите использовать:

@import AwesomeLibrary.AwesomeObject;

Для всех новых проектов, выполненных в Xcode 5, модули включены по умолчанию. Если вы хотите использовать модули в старых проектах (и вам это действительно нужно), их нужно будет включить в настройках сборки проекта. Как только вы это сделаете, вы можете использовать оба #import а также @import заявления в вашем коде вместе без каких-либо проблем.

История:

#include => #import => .pch => @import

#include vs #import
.pch - предварительно скомпилированный заголовок

Модуль - @import

Product Name == Product Module Name 

@moduleдекларация говорит компилятору загрузить предварительно скомпилированный двоичный файл фреймворка, что сокращает время сборки. Модульная структура содержит.modulemap [Около]

Если функция модуля включена в проекте Xcode #include а также #import директивы автоматически преобразуются в @import это дает все преимущества

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

Похоже, что с XCode 7.x появляется много предупреждений при включении модуля clang с CLANG_ENABLE_MODULES

Посмотрите на Много предупреждений при сборке с Xcode 7 с сторонними библиотеками

Есть несколько преимуществ использования модулей. Вы можете использовать его только с каркасом Apple, если карта модуля не создана. @import немного похож на предварительную компиляцию заголовочных файлов при добавлении в .pch файл, который является способом настройки приложения в процессе компиляции. Кроме того, вам не нужно добавлять библиотеки по-старому, используя @import гораздо быстрее и эффективнее на самом деле. Если вы все еще ищете хороший справочник, я настоятельно рекомендую вам прочитать эту статью.

Другие вопросы по тегам