OC之@class

假设有两个类,一个是Card,一个是Person,当Card中包含Person,咱们就须要在Card前加上#import “Person.h“。若是此时Person中再包含Card的话,咱们就又得在Person类前加上#import “Card.h”。这时再编译运行就会出现故障,由于编译运行会致使两个类不停得拷贝对方,致使报错。面试

这是能够在两个类前用:spa

@class .net

就能够避免这种问题,好比在Person中用@class Card;代替#import “Card.h”。在Card中用@class Person;代替#import “Person.h”。可是这样仍是有一个问题,它仅仅告诉编译器某个名称是一个类,并无把这个类中的全部东西拷贝过来。在实际开发中:开发

(1) 在.h文件中用@class来声明类get

(2) 在.m文件中用#import来包含类的全部东西编译器

@class #import的区别(高频面试题)编译

对于循环依赖关系来讲,好比A类引用B类,同时B类也引用A类:class


这种代码会报错,当时用@class在两个类中互相声明,就不会编译报错。效率

(1)#import方式会包含被引用类的全部信息,包括被引用类的变量和方法;@class方式只是告诉编译器在A.h文件中B *b只是类的声明,具体这个类有什么信息,这里不须要知道,等实现文件中真正要用到时,才会去查看B类中信息。import

(2)若是有上百个头文件都#import了同一个文件,或者这些文件依次被#import,那么一旦最开始的头文件稍有改动,后面引用这个文件的全部类都要从新编译一遍,这样对效率的影响也是可想而知的。相对来说,使用@class方式就不会出现这种问题了。

(3)在.m实现文件中,若是须要引用到被引用类的尸体变量或者方法时,还须要使用#import方式引用被引用类。

相关文章
相关标签/搜索