Подтвердить что ты не робот

Что делает @class в iOS 4?

Есть ли разница в выполнении

@class MyViewController;

а не выполнять обычный импорт .h в appdelegate.h

#import "MyViewController.h"

Недавно я видел несколько примеров использования метода @class и задавался вопросом, есть ли какие-либо отличия.

спасибо.

4b9b3361

Ответ 1

Существует большая разница.

@class MyViewController;

Является объявлением для объекта MyViewController. Он используется, когда вам просто нужно сообщить компилятору о типе объекта, но не нужно включать заголовочный файл.

Если вам нужно создать объект этого типа и вызвать методы на нем, вам нужно будет:

#import "MyViewController.h"

Но обычно это делается в файле .m.

Дополнительное использование форвардных объявлений - это когда вы определяете @protocol в том же заголовочном файле, что и объект, который его использует.

@protocol MyProtocolDelegate; //forward declaration

@interface MyObject {
    id<MyProtocolDelegate> delegate;
    ...
}
...
@end

@protocol MyProtocolDelegate
    ... //protocol definition
@end

В приведенном выше примере компилятор должен знать, что @protocol MyProtocolDelegate действителен, прежде чем он сможет скомпилировать объект MyObject.

Простое перемещение определения протокола выше MyObject также будет работать.

Ответ 2

@class позволяет объявить, что символ является именем класса Objective-c без необходимости #import файла заголовка, который определяет класс.

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

Сохраняет минимальное количество времени компиляции по сравнению С#import, и иногда помогает избежать беспорядочных проблем с округлением.

[И, как указывает rjstelling, иногда полезно, когда у вас есть чередующиеся объявления, и вам нужно что-то "переслать".]