что делает @class в разработке под iOS 4? - PullRequest
18 голосов
/ 29 июля 2011

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

@class MyViewController;

вместо обычного импорта .h в appdelegate.h

#import "MyViewController.h"

Недавно я видел пример, использующий способ @class, и задавался вопросом, есть ли различия.

спасибо.

Ответы [ 2 ]

21 голосов
/ 29 июля 2011

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

@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 Определение также будет работать.

6 голосов
/ 29 июля 2011

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

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

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

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

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