Цель-C: предварительная декларация класса - PullRequest
47 голосов
/ 04 марта 2011

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

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

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

Ответы [ 2 ]

100 голосов
/ 04 марта 2011

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

2 голосов
/ 05 июня 2018

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...