Хороший ответ вы можете найти в книге «Изучение какао с 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. Чтобы справиться с этим, программисты на Си должны написать защиту от такого типа событий.
При использовании #import
вам не нужно беспокоиться об этой проблеме или писать защиту заголовков, чтобы избежать ее. Тем не менее, #import
это всего лишь прославленное действие копирования и вставки, вызывающее медленное время компиляции среди множества других небольших, но все же очень опасных проблем (таких как включенный файл, переопределяющий то, что вы объявили в другом месте своего собственного кода).
Модули - это попытка обойти это. Они больше не являются копией и вставкой в исходный код, а представляют собой сериализованное представление включенных файлов, которые могут быть импортированы в ваш исходный код только тогда и там, где они необходимы. При использовании модулей код обычно компилируется быстрее и безопаснее, чем с использованием #include или #import
.
Возвращаясь к предыдущему примеру импорта фреймворка:
#import <SomeLibrary/SomeFile.h>
Чтобы импортировать эту библиотеку как модуль, код будет изменен на:
@import SomeLibrary;
Это имеет дополнительный бонус Xcode, автоматически связывающий платформу SomeLibrary с проектом. Модули также позволяют включать в проект только те компоненты, которые вам действительно нужны. Например, если вы хотите использовать компонент AwesomeObject в платформе AwesomeLibrary, обычно вам придется импортировать все, чтобы использовать один фрагмент. Однако, используя модули, вы можете просто импортировать конкретный объект, который вы хотите использовать:
@import AwesomeLibrary.AwesomeObject;
Для всех новых проектов, сделанных в Xcode 5, модули включены по умолчанию. Если вы хотите использовать модули в старых проектах (и вам это действительно нужно), их нужно будет включить в настройках сборки проекта. Как только вы это сделаете, вы можете без проблем использовать оба оператора #import
и @import
операторы в своем коде.