import class什么意思,import include class区别

  import class什么意思,import include class区别

  #import和@class的区别1.import会包含这个类的所有信息,包括实体变量和方法,而@class只是告诉编译器,它后面声明的名字就是这个类的名字。至于这些类是怎么定义的,暂时不去想。我以后告诉你。

  2.在头文件中,通常只需要知道被引用类的名称。不需要知道它的内部实体变量和方法,所以一般在头文件中用@class来声明这个名字是类的名字。在实现类中,因为会用到引用类的内部实体变量和方法,所以需要使用#import来包含被引用类的头文件。

  3.从编译效率来说,如果你有100个头文件全部#导入同一个头文件,或者这些文件被依次引用,比如AB,BC,Cd,当初始头文件发生变化时,所有引用它的后续类都需要重新编译。如果你有很多课,那会花很多时间。但不是用@class。

  4.如果存在循环依赖,比如:AB,BA,如果用#import互相包含,那么就会出现编译错误。如果用@class在两个类的头文件中互相声明,就不会出现编译错误。

  所以一般来说,@class放在interface里面,只是为了在interface里面引用这个类,把这个类作为一个类型。在实现这个接口的实现类中,如果需要引用这个类的实体变量或方法,还需要导入@class中声明的类。

  举个例子来说明。

  在a类中

  #import ClassB.h相当于#include整个。h头文件。如果有很多。m文件#import ClassA.h,这些文件在编译时也会给#import ClassB.h增加不必要的#import,浪费编译时间。在大型软件中,减少include in非常重要。h文件。

  如果

  只有ClassB,则没有include ClassB.h,只有# importClassB.h是。需要classb的m文件。

  那么什么时候可以用呢?

  如果只有一个指向ClassB的指针需要在ClassA.h中声明,可以在Class A.H中声明。

  @ClassB

  .

  ClassB *指针;

  假设有两个类:ClassA和ClassB,它们互相使用形成循环依赖。如果头文件中只使用了#import来包含对方的头文件(循环包含),编译器会报错:

  “ClassA”之前应为说明符限定符列表

  或者

  “ClassB”之前应为说明符限定符列表

  为了避免循环包含,请使用@class classB将classB包含在ClassA.h文件中。类似地,使用@class ClassA将ClassA包含在ClassB.h文件中。@class指令只是告诉编译器这是一个类,给指针预留一个空间就够了。

  接下来很可能会出现在ClassA.m和ClassB.m中访问被包含对象成员的情况,这个时候编译器就必须知道更多的信息,比如那个类中有一些方法是可以调用的,就需要使用#import再次包含被使用的类,并告诉编译器需要的额外信息。

  否则,编译器会警告:

  警告:接收器“ClassA”是一个转发类,相应的@interface可能不存在

  在另一种情况下,如果使用带有类别的类,则应该在。带有#import的h头文件。

  简而言之,使用原则是:

  只有头文件中的#import超类消息文件#导入过去需要发送消息的类,用@class转到别处声明。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: