iOS中@class和#import

796 阅读2分钟

这是我参与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