@class
is used when you need to know the name of a class in a particular file, but you don't need to know any details about the class (its methods, for example). #import
is used when you actually need to use the class (i.e., send it a message).
For example, if you're declaring instance variables in a header file, you can use @class
to declare an instance variable of a certain type:
@class MyOtherClass;
@interface MyClass : NSObject
{
MyOtherClass *myIvar;
}
@end
Since you're not using myIvar
yet, you don't need to know anything about it except that the type MyOtherClass
exists.
However:
#import "MyOtherClass.h"
- (void)doSomething
{
[myIvar doSomethingElse];
}
In this case, you're sending the doSomethingElse
message to myIvar
; the compiler needs to know that instances of MyOtherClass
define this method, so you have to import the header file or the compiler will complain.
Why worry about this?
It mostly has to do with dependencies. When you #import
file A into file B, file B becomes dependent upon file A -- that is, if file A changes, you'll have to recompile file B. If you use @class
in file B, file B is not dependent on file A, and thus doesn't need to be recompiled when file A changes -- so if you're just declaring a type and not actually dependent upon the implementation of file A, you can save yourself compilation time by not #import
ing file A.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…