Цель-C: предварительное объявление класса

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

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

#import <UIKit/UIKit.h>
@class RootViewController;
@interface MyAppDelegate
.
.
.

2 ответа

Решение

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

Это особенно полезно при разрешении циклических зависимостей - например, где говорят ClassA имеет член типа ClassB*, а также ClassB имеет член типа ClassA*, Тебе нужно иметь ClassB объявлено, прежде чем вы можете использовать его в ClassA, но вам также нужно ClassA объявлено, прежде чем вы можете использовать его в ClassB, Предварительные заявления позволяют вам преодолеть это, сказав ClassA тот ClassB существует, без необходимости фактически указывать ClassB's полная спецификация.

Другая причина, по которой вы склонны находить много предварительных объявлений, заключается в том, что некоторые люди принимают соглашение о предварительном объявлении классов, если они абсолютно не должны включать полное объявление. Я не совсем помню, но, возможно, это то, что Apple рекомендует в своих руководящих принципах Objective-C.

Продолжая мой пример выше, если ваши заявления ClassA а также ClassB находятся в файлах ClassA.h а также ClassB.h соответственно, вам нужно #import какой бы ни использовать свое объявление в другом классе. Использование предварительного объявления означает, что вам не нужно #import, что делает код красивее (особенно после того, как вы начнете собирать довольно много классов, каждому из которых потребуется `#import, где он используется), и увеличивает производительность компиляции, сводя к минимуму объем кода, который компилятор должен учитывать при компиляции любого заданного файл.

Кроме того, хотя этот вопрос касается исключительно предварительных объявлений в Objective-C, все последующие комментарии также в равной степени относятся к кодированию на C и C++ (и, возможно, во многих других языках), которые также поддерживают предварительное объявление и обычно используют его для те же цели.

Форвардные объявления в основном предназначены для того, чтобы избежать циклического импорта, когда один файл импортирует другой файл, который импортирует первый файл и т. Д. В основном, когда вы импортируете файл, содержимое файла заменяется в точке импорта при сборке проекта, который затем подается компилятору. Если у вас есть циклический импорт, у вас будет бесконечный цикл, который никогда не будет компилироваться. К счастью, xcode расскажет вам об этом перед попыткой. В предварительном объявлении говорится: "Не импортируйте этот класс, а просто знайте, что он существует". Без импорта или прямого объявления вы получите ошибку, что такого класса не существует.

@class или forward class declaration(неполный тип) - просто сообщите компилятору, что этот класс существует. В этом случае компилятор ничего не знает о структуре памяти типов - размере класса, членах или методах. Вот почему вы можете использовать для определения классов только ссылки и указатели.

Преимущества:

  • сократить время сборки
  • разбивать циклические ссылки
Другие вопросы по тегам