首页 > 代码库 > IOS强化知识(2)@class的运用
IOS强化知识(2)@class的运用
1、为什么使用@class
与C++语言一样,OC也需要一个头文件(h文件),一个实现文件(m文件)。当你引用其他类的时候,你就需要引入头文件。虽然引用头文件没有任何问题,但是如果你不想知道这个类的细节,只想知道它仅仅是个类的话,引用头文件可能显得多余,而且会增加编译的时间。用@class的话,你可以不引入任何头文件,就能让编译器知道某个它是一个类。例如:
@class B;
@interface A:NSObject
@property B* b;
@end;
极端情况讲,如果有成千上万个类都引入同一个头文件,当这个头文件所对应的类发生变化和改动,那么这些引入头文件的类都需要重新编译,而@class 不受此影响。
@class还能解决一个重要的问题,就是依赖循环关系。即当两个类相互引用的时候,不管你先引用哪一个头文件,都会出现另一个类未定义。比如:
//// A.h
@interface A:NSObject
@property B* b; /////先引入A.h B此时未定义 编译出现错误
@end;
//// B.h
@interface B:NSObject
-(void)setFriend:(A*)a; ////先引入B.h A此时未定义 编译出现错误
@end;
我们通过@class 轻松解决这个问题
//// A.h
@class B;
@interface A:NSObject
@property B* b; /////前向声明B 编译通过
@end;
//// B.h
#import "A.h"
@interface B:NSObject
-(void)setFriend:(A*)a; ////引入A.h A被声明,编译通过 注:A类也可以进行前向声明
@end;
2、有时候必须引入头文件
当你需要继承的时候,你必须引入头文件,知道其完整的定义。当你实现某个协议的时候,同样的道理。所以我们最好把协议单独放在一个头文件里。
当然最好还是能不引入头文件就不引入,如果需要引入一些头文件的时候,也可以考虑放到分类(category)中,这样的好处是增加编译的效率和降低类之间的耦合。
今天要点:
除非有必要,否则不引入头文件。这样做可以降低耦合,减少编译时间。
无法前向声明时,尽量把引入头文件的操作放到category中。
IOS强化知识(2)@class的运用