Что делает @class в Objective-C? - PullRequest
       0

Что делает @class в Objective-C?

50 голосов
/ 11 октября 2010

Может кто-нибудь объяснить, что делает объявление @class в Objective-C и в каких случаях мы должны использовать это объявление?

Ответы [ 4 ]

92 голосов
/ 11 октября 2010

Это предварительная декларация.По сути, это говорит компилятору, что существует класс с таким именем.Я использую его в объявлениях интерфейса:

@class Foo;
@interface Bar : NSObject {
    Foo *someFoo;
}
@end

Конечно, вместо этого вы можете импортировать заголовок для Foo:

#import "Foo.h"
@interface Bar : NSObject {
    Foo *someFoo;
}
@end

Но если someFoo не предоставляется пользователямBar, они импортируют дополнительный заголовочный файл, который им не нужен.С объявлением @class пользователи Bar не видят дополнительного импорта, потому что Foo.h будет импортирован в файл реализации Bar.

24 голосов
/ 11 октября 2010

это называется предварительным объявлением.

вы используете эту директиву, чтобы сообщить компилятору, что существует класс objc с указанным именем. другие ваши варианты - включить интерфейс или использовать id для переменных или типов.

это полезно для минимизации зависимостей. я использую их всякий раз, когда могу минимизировать зависимости и значительно сократить время сборки.

это так же, как в c и c ++:

struct mon_struct;
namespace MON { class mon_class; }
8 голосов
/ 22 августа 2014

надеюсь, что это поможет немного больше

Над ответом уже указано почти все, я хотел бы добавить кое-что к нему.

@class Foo является предварительным объявлением Fooучебный класс.Это все равно, что сказать компилятору, что класс foo существует. Так что не беспокойтесь об этом прямо сейчас.

Примечание: - Объявление класса становится очень важным, когда оба класса нуждаются друг в друге.если мы сделаем обычное выражение #import, то получим бесконечный цикл импорта, а компиляторам не нравятся бесконечные циклы.Поэтому мы используем @class Classname.

1 голос
/ 07 августа 2012

@class используется для создания предварительного объявления любого класса. Если вы создаете какой-либо класс, реализация которого вам неизвестна, вы можете сделать это с помощью директивы компилятора @class.

Вы можете реализовать этот класс, когда вам известна реализация.

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