oc 中 ID 数据类型 以及 #import 和@class区别 摘要

来源:互联网 发布:oracle数据库建表语句 编辑:程序博客网 时间:2024/06/08 07:06
  • ID数据类型
    1.      通用的指针类型
    2.      没有*
    3.      可以指向任何类的对象(设置是nil),而不关心其具体类型
    4.      在运行时检查其具体类型
    5.      可以对其发送任何(存在的)消息

id是泛类型,可以用来存放各种类型的对象,使用id也就是使用“动态类型”。id
在执行时Objetive-C的执行环境会找出该id所代表原来类型。

          id gr;
          gr=[[Elli1 alloc]init];
          [gr release];       
          gr=[[Elli2 alloc]init];
          [gr release];




#import和@class在oc中的区别。

1.#import会包含这个类的所有信息,包括实体变量和方法,而@class只是告诉编译器,其后面声明的名称是类的名称,在编译的时候,告诉编译器,这是一个类名,无需报错。

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

3.在编译效率方面考虑,如果你有100个头文件都#import了同一个头文件,或者这些文件是依次引用的,如A–>B, B–>C, C–>D这样的引用关系。当最开始的那个头文件有变化的话,后面所有引用它的类都需要重新编译,如果你的类有很多的话,这将耗费大量的时间。而是用@class则不会。

4.如果有循环依赖关系,如:A–>B, B–>A这样的相互依赖关系,如果使用#import来相互包含,那么就会出现编译错误,产生死循环的问题。如果使用@class在两个类的头文件中相互声明,则不会有编译错误出现。


综上所述.@class一般出现在头文件中.#import一般出现在实现,也就是.m中.

其解决两个类循环依赖调用的问题(在 .h 文件里)。
ex:两个类 Teacher  、Student。
     在Teacher . h 里 定义方法:-(void)teach : ( Student  *) stu ; 因为这里用到了Student 的对象,所以在这里需要导入 #import “ Student .h ”。  
      在Student . h 里定义方法:-(void )listen :(Teacher *)tea;因为这里用到了Teacher 的对象,按理要导入 #import “ Teacher .h”,但导入后会报错。
     所以这时候就要在 Student.h 里(注意是.h 文件里)导入@class  Teacher ,这时候就可以使用对象 tea。
     但若在两个类的 .m 文件里要使用彼此的方法,那就必须相互导入 #import Teacher  和 #import Student。这时不会报错。
0 0
原创粉丝点击