Почему @class вместо #import для ViewController в AppDelegate.h? - PullRequest
3 голосов
/ 26 января 2012

У меня есть основной вопрос передового опыта в Задаче C. Я понимаю разницу между @class и #import, но я не понимаю, почему стандартные шаблоны Apple Xcode делают это:

AppDelegate.h:

@class ViewController;

.m:

#import "ViewController.h

Когда вы могли бы вместо этого просто поместить последний #import в .h и оставить упоминание о ViewController из .m в целом, упрощая тем самым одну строку кода.

Конечно, сохранение 1 строки кода не проблема, мне просто интересно, почему это делается таким образом?

Ответы [ 3 ]

15 голосов
/ 26 января 2012

Строка @class ViewController; является предварительным объявлением, поэтому у компилятора есть представление о том, что должно означать имя ViewController.Суть в том, чтобы попытаться сделать как можно меньше #import в заголовочном файле, чтобы ускорить компиляцию.

Представьте себе файл a.h, который выполняет #import "b.h".Теперь каждый файл, который импортирует a.h, автоматически импортирует также b.h, что увеличивает объем работы, которую должен выполнять компилятор.Используя предварительные объявления, часто можно избежать таких дополнительных импортов и, таким образом, избежать дополнительной работы для компилятора.

Чем больше проект и чем сложнее иерархии и зависимости классов, тем больше могут стать эти #import sпроблема.Поэтому неплохо выработать привычку по возможности использовать предварительные объявления.

Редактировать: После комментариев всплыл еще один важный пример использования: для разрешения циклических зависимостей.Например, если класс A хочет сослаться на класс B и наоборот, один должен быть определен раньше другого.Но поскольку им нужно знать другого, у нас возникает парадокс.Это решается так:

// Tell the compiler: B will be a class type.
@class B;

// Now we can define A, the compiler has enough
// information to know what B means.
@interface A : NSObject {
    B *b;
}
@end

// Since A is now defined, we can define B.
// Cycle is resolved.
@interface B : NSObject {
    A *a;
}
@end
2 голосов
/ 26 января 2012

Объявление класса пересылки:

@class ClassName;

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

Это позволяет #import или #include изфайл заголовка без каких-либо накладных расходов, который поставляется с #import ing ClassName.h.

0 голосов
/ 26 января 2012

#import используется для класса, который предопределен нами или Apple Xcode, но @class мы используем до того, как определим его (это прямое объявление класса), в нашем родительском / или предыдущем классе

поэтому он сообщает компилятору, что в нашем проекте есть класс с таким именем, чтобы компилятор не выдавал ошибки для этого имени класса.

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