在网上找了些资料关于#import跟@class的区别是在于#import会增加编译器编译的时间,@class则不会,但是@class不能访问到类的成员变量和方法。但是在测试中有点奇怪。跟网上的说法不大一样。
#import "Car.h" #import "Engine.h" #import "Tire.h" @implementation Car { // Engine *engine; // Tire *tires[4]; // 在interface中声明在别的类中可以使用,可以是public的,但在implementation中声明,只能是私有成员。 } -(void)setEngine:(Engine *)newEngine { [newEngine Save]; engine = newEngine; } -(Engine *)engine { return engine; } -(void)setTire:(Tire *)tire atIndex:(int)index { if(index < 0 || index > 3) { NSLog(@"Error"); exit(1); } tires[index] = tire; } -(Tire *)tireAtIndex:(int)index { if (index < 0 || index > 3) { NSLog(@"Error"); exit(1); } return (tires[index]); } -(void)print { for (int i = 0; i<4; i++) { NSLog(@"%@",tires[i]); } NSLog(@"%@",[engine description]); //description 类似C#中的toString } @end
其中当注释掉 #import "Engine.h" 后,Xcode会提示/OC/Car/Car/Car.m:22:16: Instance method '-Save' not found (return type defaults to 'id') 但是编译也能过,最后也能生成正确的结果。其中在Car中的头文件中声明了
#import <Foundation/Foundation.h> @class Engine; @class Tire;
不知道是否与这个有关系,如果不注释掉的话,Xcode不会提示警告,不知道是什么原因。
网上的大神们推荐的用法是
(1)一般如果有继承关系的用#import,如B是A的子类那么在B中声明A时用#import; (2) 另外就是如果有循环依赖关系,如:A->B,B->A这样相互依赖时,如果在两个文件的头文件中用#import分别声明对方,那么就会出现头文件循环利用的错误,这时在头文件中用@class声明就不会出错; (3)还有就是自定义代理的时候,如果在头文件中想声明代理的话如@interface SecondViewController:UIViewController时应用#import不然的话会出错误,注意XXXXDelegate是自定义的。
另外interface和implementation中声明变量的区别在于前者声明的变量在其他类中也可以使用,如果不是private的话,后者的变量属性只能为private
还有一个是description,这个类似于C#中的ToString。简单易懂。