这是我参与8月更文挑战的第16天,活动详情查看:8月更文挑战
@class和#import的区别
-
使用
#import引入一个类的头文件,编译时会将该类的头文件中的所有信息都引入,包含属性和方法 -
使用
@class仅仅只是告诉编译器声明的类的名称,并不会引入该类的其他信息,而我们所关心的也仅此一点,而不需要知道该类的内部有哪些属性和方法,因此使用@class可以提升编译性能。使用@class引入,这种方式叫“向前声明”该类
应用场景
-
一般情况下,我们在.h头文件中使用
@class,可以提升编译性能;而在.m实现文件中,往往就需要知道该类的内部信息了,这时就需使用#import来引入这些信息@class Hobby; @interface Person : NSObject @property (nonatomic,strong) NSString *name; @property (nonatomic,strong) Hobby *hobby; @end ------------------------------------- #import "Person.h" #import "Hobby.h" @implementation Person - (instancetype)init{ if (self = [super init]) { self.hobby = [[Hobby alloc]init]; [self.hobby playGames]; } return self; } @end -
一般如果有继承关系的用
#import,如B是A的子类,那么在B中声明A时用#import#import <Foundation/Foundation.h> @interface Person : NSObject @end ------------------------------------- #import <Foundation/Foundation.h> #import "Person.h" @interface Student : Person @end -
为了避免两个类之间循环引用,我们在某一个类的.h文件中用
@class进行导入如果俩个类是循环引用关系,A类引用B类,同时B类也引用A类,这时用
#import,代码在编译时是会报错#import <Foundation/Foundation.h> #import "Girl.h" @interface Boy : NSObject @property (nonatomic,strong) Girl *girl; @end ------------------------------------- #import <Foundation/Foundation.h> #import "Boy.h" @interface Girl : NSObject @property (nonatomic,strong) Boy *boy; @end -
为了解决这个问题,可以采用
@class的方式进行引用,一个用#import一个用@class,或者两个都用@class都可以避免报错#import <Foundation/Foundation.h> #import "Girl.h" @interface Boy : NSObject @property (nonatomic,strong) Girl *girl; @end ------------------------------------- #import <Foundation/Foundation.h> @class Boy; @interface Girl : NSObject @property (nonatomic,strong) Boy *boy; @end