写点什么

iOS 中 @class 和#import

作者:NewBoy
  • 2022 年 7 月 22 日
  • 本文字数:1075 字

    阅读完需:约 4 分钟

@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
复制代码


发布于: 2 小时前阅读数: 12
用户头像

NewBoy

关注

虽不年少,艳阳高照 2019.04.10 加入

还未添加个人简介

评论

发布
暂无评论
iOS中@class和#import_ios_NewBoy_InfoQ写作社区