Строка @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