В чем разница между этими объявлениями #import? - PullRequest
5 голосов
/ 23 мая 2011

Я собираюсь отправить письмо из своего приложения, и я добавил каркас MessageUI. В примере кода от Apple они пишут это:

#import <MessageUI/MessageUI.h>
#import <MessageUI/MFMailComposeViewController.h>

В чем разница между ними и тем, что там делает "косая черта"?

Ответы [ 2 ]

6 голосов
/ 23 мая 2011
#import <MessageUI/MessageUI.h>
#import <MessageUI/MFMailComposeViewController.h>

В чем разница между этими, и что там делает "косая черта"?

набор инструментов добавляет поддержку для фреймворков, а также определяет пути поиска (например, для заголовков и ссылок) для фреймворков с учетом параметров сборки.

фреймворк определяет каталог Headers/.

при использовании этого пути каркаса могут быть разрешены / обнаружены при разделении с использованием разделителя пути (/).

в случае с фреймворками apple, первая идиома #import <FRAMEWORK_NAME/FRAMEWORK_NAME.h> - это обычный способ включения общих объявлений фреймворка через включение (большинства) публичных заголовков фреймворка. во многих случаях он будет включать все общедоступных заголовков фреймворка, но есть некоторые исключения. использование этой идиомы в вашей программе, как правило, лучше, поскольку она изолирует вас от внутренних зависимостей заголовков, которые могут меняться в разных выпусках.

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

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

есть еще несколько причин, по которым вы можете выбрать последнюю форму:

  • языковые различия: платформа может использовать несколько языков. в зависимости от компилируемого языка / диалекта, в том числе и весь фреймворк, очевидно, может привести к ошибкам сборки.
  • вам нужна только часть объявлений каркаса, видимых для внешних переводов: указание заголовка, который вы должны видеть, сокращает время сборки и зависимости.
  • совместимость и минимальная зависимость: допустим, вы написали библиотеку, предназначенную для нескольких платформ (например, osx и ios). ваша библиотека может использовать разные фреймворки / apis. конкретное включение может минимизировать количество проблем / зависимостей, или вы можете выборочно включать то, что необходимо.
6 голосов
/ 23 мая 2011

Косая черта в основном говорит, что файл .h находится в рамках платформы, названной перед косой чертой.

Разница между ними заключается в том, что при использовании /MessageUI.h> вы делаете то же самое, что и импорт каждого отдельного класса в платформе. Когда вы используете /MFMailComposeViewController.h>, вы реализуете только один класс в рамках. Поэтому никакие другие классы не будут доступны кроме импортированного класса.

...