objective-C: декларация о перекрестном classе

Я пишу многопользовательское приложение, которое использует class RootViewController для переключения между представлениями.

В моем заголовке MyAppDelegate я создаю экземпляр RootViewController именем rootViewController . Я видел примеры таких, когда директива @class используется как «декларация прямого classа», но я не совсем уверен, что это означает или выполняет.

 #import  @class RootViewController; @interface MyAppDelegate . . . 

Он в основном сообщает компилятору, что существует 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 не существует.

  • biginteger по Objective-c
  • В чем разница между строковой константой и строковым литералом?
  • NSString tokenize в Objective-C
  • JSON и core data на iPhone
  • Декодирование JSON в NSArray или NSDictionary
  • Загрузка изображения через POST в Objective C
  • Как декодировать поле полилиний API Google Directions в длинные точки lat в объективе C для iPhone?
  • Как узнать, кто вызвал метод?
  • Как можно разрабатывать приложения для iPhone на Java?
  • Можно ли запрограммировать iPhone на C ++?
  • Лучший способ определить частные методы для classа в Objective-C
  • Давайте будем гением компьютера.