Подтвердить что ты не робот

Objective-C: декларация форвардного класса

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

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

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

Ответ 1

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

Это особенно полезно при разрешении круговых зависимостей - например, где say 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 и С++ (и, возможно, на многих других языках), которые также поддерживают декларацию в прямом направлении и обычно используют это для тех же целей.