2013-09-22 2 views
394

Я играю с некоторыми из новых функций iOS 7 и работаю с некоторыми из Image Effects, как описано в видео WWDC «Реализация взаимодействия с пользовательским интерфейсом на iOS». Для получения эффекта размытия в пределах исходного кода для сессии, UIImage был расширен через категорию, которая импортирует UIKit так:@import vs #import - iOS 7

@import UIKit; 

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

+0

http://stackoverflow.com/questions/29701647/use- of-import-when-modules-are-disabled –

+0

http://stackoverflow.com/questions/29701647/use-of-import-when-modules-are-disabled –

ответ

798

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

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

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

Модули предустановлены для большинства фреймворков Apple (UIKit, MapKit, GameKit и т. Д.). Вы можете использовать их с создаваемыми вами каркасами: они создаются автоматически, если вы создаете структуру Swift в Xcode, и вы можете вручную создать файл «.modulemap» самостоятельно для any Apple or 3rd-party library.

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

enter image description here

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

Вы должны использовать Xcode 5 и IOS 7 или Маверикс SDK, но вы можете освободить для более старых операционных систем (скажем, IOS 4,3 или любой другой). Модули не меняют способ создания кода или какого-либо исходного кода.


Из WWDC слайдов:

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

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

Replace #import <Cocoa/Cocoa.h> с @import Cocoa;

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

@import iAd.ADBannerView; 

Автозаполнение субмодулей для вас в Xcode.

+14

@DaveDeLong & Klaas: Спасибо!Я должен признать, что я ничего не знал о модулях, когда я впервые ответил на это. Я пошел и посмотрел сессию 404, чтобы узнать ее. Презентация, которую дал Дуг Грегор (парень LLVM), была действительно хорошо сделана. Там также есть диалог на C++, где объясняются преимущества здесь: http://www.youtube.com/watch?v=4Xo9iH5VLQ0 –

+3

@ nevan-- спасибо за ответ. Я просто хотел добавить, что модули в настоящее время не поддерживают сторонних разработчиков и ваши собственные фреймворки. – jamdaddy25

+0

Можете ли вы использовать это для своих классов? – cfischer

2

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

1

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

39

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

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

#import "someFile.h" 

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

#import <SomeLibrary/SomeFile.h> 

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

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

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

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

#import <SomeLibrary/SomeFile.h> 

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

@import SomeLibrary; 

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

@import AwesomeLibrary.AwesomeObject; 

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

+0

В моем проекте (Xcode 6) нет варианта, который я впервые начал на Xcode 4 для включения модулей. Могу ли я добавить его вручную? –

+0

Цель сборки - iOS 6, я думаю, что это проблема –

2

кажется, что с XCode 7.xa много предупреждений выходит при включении модуля лязг с CLANG_ENABLE_MODULES

Взгляните на Lots of warnings when building with Xcode 7 with 3rd party libraries

+0

Да, у меня тоже есть эта проблема, но при ее установке NO не удаляет все предупреждения. Будет ли побочный эффект, когда я это сделаю? – satheeshwaran

Смежные вопросы