大话#import和@class区别

来源:互联网 发布:放置江湖ios数据修改 编辑:程序博客网 时间:2024/05/23 22:39

#import与#include的区别

#import和#include同样可以将头文件引入到我们需要的文件中,假设有a.h、b.h、c.h三个头文件。假设b.h中包含a.h,c.h中包含a.h和b.h。
1. 如果适用#include来包含头文件,那么在c.h中相当于包含了两次a.h,这样在编译时就会引起不必要的错误,这时就需要引入头文件保护符才能避免c.h中包含两次a.h,详见这篇文章c++中预处理变量#define#ifndef#endif的作用。
2. 如果适用#import来包含头文件,那么不需要做任何事情,在c.h中就只会包含一次a.h,而不会引起任何错误。不管你对一个文件同时包含了多少次,使用#import只会包含一次

#import与@class的区别及使用场合

类与类或者对象与对象之间的关系通常有两种:1. 继承; 2.组合(即一个类中使用了另一个类声明的成员变量)。
第二种情况下,通常可以使用#import来建立包含关系,如下代码,在头文件A.h中需要使用B的对象,

#import "B.h"@interface A:NSObject{B *b;}@end

分析:在上面代码中,通过#import B.h使类A可以通过指针来引用它。但是这样关于类B的所有东西都将引用到类A中,但是我们发现,在A.h中根本没有使用到类B的任何方法,也就是说我们只需要知道B是一个类就可以了。
这种情况下,可以使用@class B来代替#import B.h,因为使用@class关键字同样可以使编译器知道B是一个类,可以通过指针来引用它。而且使用@class B不会将类B的内容引用到类A中,而只是告诉编译器B是一个类。

试想:如果有一个头文件A.h,在其他大量头文件中都需要引用头文件A.h,如果使用的是#import,那么当A.h中有了一点改动时,其他包含A.h的头文件都需要重新编译,这样讲大大的降低了开发效率。而如果使用的是@class,当A.h中有了一点改动时,由于其他头文件并没有将A.h的内容包含进来,就不用重新编译,即会提高开发效率。因此在头文件中如果没有用到包含类的实现方法,只需要知道它是一个类时,就应该使用@class,而不是#import。如果需要使用类的一些方法时,只能使用#import

@class在循环引用中的使用

试想有如下代码;

//A.h头文件#import "B.h"@interface A:NSObject{B *b;}@end//B.h头文件#import "A.h"@interface A:NSObject{A *a ;}@end

在上面这种A包含B,B包含A的情况,称为循环引用
在上面代码是不能通过编译器编译的,编译器会报错
在这种循环引用情况下,只能使用@class。即将#import B.h换为@class B,将#import A.h换为@class A。

总结

  1. 使用#import不管你对一个文件同时包含了多少次,最终只会包含一次;
  2. 能使用#import的地方就不要使用#inlclude;
  3. 能使用@class的地方就不要使用#import。
1 0
原创粉丝点击