Цель-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
(неполный тип) - просто сообщите компилятору, что этот класс существует. В этом случае компилятор ничего не знает о структуре памяти типов - размере класса, членах или методах. Вот почему вы можете использовать для определения классов только ссылки и указатели.
Преимущества:
- сократить время сборки
- разбивать циклические ссылки