`
ydbc
  • 浏览: 720222 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

OC学习那些事:@class关键字

 
阅读更多

1.引用一个类的两种办法

@class:如果你只是定义成员变量、属性

#import:如果是继承某个类

2.两种方法的区别

#import方式会包含被引用类的所有信息,包括被引用类的变量和方法

#import<Foundation/Foundation.h> 
 
//#import "Book.h"类似 
@interface Book : NSObject 
@end 
 
@interface Student : NSObject 
{ 
    Book *_book; 
} 
@property Book*book; 
@end 

@class方式只是告诉编译器在A.h文件中,B*b只是类的声明,具体这个类有什么信息,这里不需要知道。等实现文件中真正需要的时候,才会真正查看B类中的信息

3.正确使用方法

Student.h文件

//import<Foundation/Foundation.h>是为了知道Foundation框架有什么成员,和方法,避免重复定义等。 
#import<Foundation/Foundation.h> 
//声明的时候告诉是个类 
@class Book; 
@interface Student : NSObject 
{ 
    Book *_book; 
} 
@property Book*book; 
@end 

Student.m文件

//使用的时候,在告诉有什么成员和方法

#import "Book.h" 
@implement Student 
{ 
    … … 
} 
@end

4.@class方式

使用@class方式由于只需要知道被引用类(B类)的名称就可以了,而在实现类由于要用到被引用类中的实体变量和方法,所以在.m文件中需要使用#import来包含引用类的头文件。

如果又上百个头文件都#import同一个文件,或者这些文件依次被#import,那么一旦最开始得头文件改动,后面引用到这个文件的所有类都需要重新编译一遍,这样的效率也可想而知的,而相对来讲,使用@class方式就不会出现这种问题。

当出现循环依赖干系的时候,#import会报错

A.h文件

#import "B.h" 
@interface A : NSObject 
{ 
    B *b; 
} 
@end 

B.h文件

#import"A.h" 
@interface B : NSObject 
{ 
    A *a; 
} 
@end 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics