objective-C: декларация о перекрестном classе
Я пишу многопользовательское приложение, которое использует class RootViewController
для переключения между представлениями.
В моем заголовке MyAppDelegate
я создаю экземпляр RootViewController
именем rootViewController
. Я видел примеры таких, когда директива @class используется как «декларация прямого classа», но я не совсем уверен, что это означает или выполняет.
#import @class RootViewController; @interface MyAppDelegate . . .
- В чем разница между и nil?
- Обратный текст NSString
- Динамическое обновление UILabel
- Кроссплатформенный обмен кодами iPhone / Android
- дублирующие символы для архитектуры i386 clang
- Как установить заголовок UIButton как выравнивание по левому краю?
- В чем разница между «методом classа» и «статическим методом»?
- Декодирование символов UTF8 в Objective C
- GCD для выполнения задачи в основной теме
- Objective C - получение номера строки или полной трассировки стека из-за ошибки отладчика?
- Как называется эта форма определения?
- Запустить AppleScript из приложения Cocoa
- Быстрый базовый class Swift или NSObject
Он в основном сообщает компилятору, что существует class RootViewController
, не указав, что именно он выглядит (т. RootViewController
Его методы, свойства и т. Д.). Вы можете использовать это для написания кода, который включает переменные-члены RootViewController
без необходимости включать объявление полного classа.
Это особенно полезно при разрешении круговых зависимостей – например, когда ClassA
имеет ClassA
ClassB*
, а ClassB
– член classа ClassA*
. Прежде чем вы сможете использовать его в ClassA
, вам необходимо ClassA
ClassA
, но вам также необходимо ClassA
прежде чем вы сможете использовать его в ClassB
. Передовые декларации позволяют вам преодолеть это, сказав ClassA
что ClassB
существует, без фактического указания полной спецификации ClassB's
.
Другая причина, по которой вы, как правило, находите множество передовых заявлений, – это то, что некоторые люди принимают конвенцию о начале декларирования classов, если они абсолютно не должны включать полную декларацию. Я не совсем помню, но, возможно, это то, что Apple рекомендует в своих руководящих указаниях стиля Objective-C.
Продолжая мой вышеприведенный пример, если ваши объявления ClassA
и ClassB
находятся в файлах ClassA.h
и ClassB.h
соответственно, вам нужно будет #import
чтобы использовать его объявление в другом classе. Использование форвардной декларации означает, что вам не нужен #import
, что делает код более красивым (особенно после того, как вы начнете собирать довольно много classов, каждый из которых будет нуждаться в `#import, где он используется), и увеличивает компиляцию производительности, сводя к минимуму количество кода, которое компилятор должен учитывать при компиляции любого заданного файла.
В стороне, хотя вопрос касается только прямых деклараций в Objective-C, все последующие комментарии также в равной степени применимы к кодированию на C и C ++ (и, возможно, на многих других языках), которые также поддерживают объявление в прямом направлении и обычно используют его для те же цели.
Форвардные декларации в основном состоят в том, чтобы избежать циклического импорта, когда один файл импортирует другой файл, который импортирует первый файл и т. Д. В основном при импорте файла содержимое файла заменяется в точке импорта при создании проекта, который затем подается компилятору. Если у вас есть циклический импорт, у вас будет бесконечный цикл, который никогда не будет компилироваться. К счастью, xcode расскажет вам об этом, прежде чем пытаться. В переднем объявлении говорится: «Не импортируйте этот class, а просто знайте, что он существует». Без объявления об импорте или переходе вы получаете сообщение об ошибке, когда такой class не существует.