Ответ 1
Строка @class ViewController;
является объявлением вперед, поэтому компилятор имеет представление о том, что должно означать название ViewController
. Суть в том, чтобы попытаться сделать как можно меньше #import
в файле заголовка, чтобы ускорить компиляцию.
Представьте себе файл a.h
, который делает #import "b.h"
. Теперь каждый файл, который импортирует a.h
автоматически, также импортирует b.h
, что увеличивает объем работы, которую должен выполнить компилятор. С помощью форвардных объявлений часто можно избежать такого дополнительного импорта и тем самым избежать дополнительной работы для компилятора.
Чем больше проект и чем сложнее иерархии классов и зависимости, тем более эти #import
могут стать проблемой. Поэтому неплохо разработать привычку использовать передовые декларации, где это возможно.
Изменить: После комментариев появился другой важный прецедент: для разрешения циклических зависимостей. Например, если класс 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