iOS #import和@class 区别

@class和#import相似。

1.@class用于 forward-class declaration,只能使用@class,

@class class2
 
@interface class1
{
    class2* class2Object;
}
 
@end
 
@interface class2
{
    class1* class1Object;
}
@end

 

2.

class1.h中引入class2.h头文件

#import "class2.h"
@interface class1
{
    class2* class2Object;
}
 
@end

class2.h中引入class1.h头文件

#import "class1.h"
@interface class2
{
    class1* class1Object;
}
@end

这种情况会导致引用死锁,所以应该用forward-class declaration,即@class,如下

class1.h

@class class2;
@interface class1
{
    class2* class2Object;
}
 
@end

class2.h

@class class1;
@interface class2
{
    class1* class1Object;
}
@end

 

总结,@class class1只是告诉编译器,class1是一个类,你不要以为class1是个未声明的野种,除此之外,没了。

但是 #import "class1.h"会告诉编译器,class1这个类中有什么东西,即class1.h中包含的函数和变量。

所以.h中使用@class绰绰有余,若你有需要创建或访问class1中的函数和变量,则必须使用#import。

 

最后给个常见的例子

@class A;

@protocol MyDelegate <NSObject>
- (BOOL)f:(A *)a;
- (void)g:(A *)a;
@end

@interface A : NSObject
@end

协议写在@interface前面,协议使用了类A,又不涉及A中的函数和变量,此时应当在协议前面写上@class A;,否则是会出错的。

posted @ 2015-05-07 16:19  Norcy  阅读(2746)  评论(0编辑  收藏  举报