假设有两个类,一个是Card,一个是Person,当Card中包含Person,我们就需要在Card前加上#import “Person.h“。如果此时Person中再包含Card的话,我们就又得在Person类前加上#import “Card.h”。这时再编译运行就会出现故障,因为编译运行会导致两个类不停得拷贝对方,导致报错。
这是可以在两个类前用:
@class 类
就可以避免这种问题,比如在Person中用@class Card;代替#import “Card.h”。在Card中用@class Person;代替#import “Person.h”。但是这样还是有一个问题,它仅仅告诉编译器某个名称是一个类,并没有把这个类中的所有东西拷贝过来。在实际开发中:
(1) 在.h文件中用@class来声明类
(2) 在.m文件中用#import来包含类的所有东西
@class 和#import的区别(高频面试题):
对于循环依赖关系来说,比如A类引用B类,同时B类也引用A类:
这种代码会报错,当时用@class在两个类中互相声明,就不会编译报错。
(1)#import方式会包含被引用类的所有信息,包括被引用类的变量和方法;@class方式只是告诉编译器在A.h文件中B *b只是类的声明,具体这个类有什么信息,这里不需要知道,等实现文件中真正要用到时,才会去查看B类中信息。
(2)如果有上百个头文件都#import了同一个文件,或者这些文件依次被#import,那么一旦最开始的头文件稍有改动,后面引用这个文件的所有类都要重新编译一遍,这样对效率的影响也是可想而知的。相对来讲,使用@class方式就不会出现这种问题了。
(3)在.m实现文件中,如果需要引用到被引用类的尸体变量或者方法时,还需要使用#import方式引用被引用类。