Objective-C基础之@class与#import
@class其实是为了解决#import导致的相互导入的问题而出现的,所谓相互导入,可以看下面例子:
首先建一个班级类Classes 和 一个学生类Student ,简单点,我们假设班级中可以找到某个学生,然后学生中也可以查看其班级,于是乎,我们立马想到要在班级中导入学生类的头文件,学生中导入班级类的头文件,代码如下:Student类:
#import <Foundation/Foundation.h> #import "Student.h" @interface Classes : NSObject { Student *stu; } @end
Classes类:
<span style="font-size: 14px;">Classes</span>#import <Foundation/Foundation.h> #import "Classes.h" @interface Student : NSObject { Classes *theClass; } @end
command + B 编译报错;
这个问题导致的原因是我们在Classes和Student中相互导入了对方的头文件,而@class则可以解决这个问题;
在其中一个类的头文件中,我们不用#import导入头文件,而是使用@class,代码如下:
Classes类:
command + B 编译通过;#import <Foundation/Foundation.h> //#import "Student.h" //使用 @class 解决相互导入问题 @class Student; @interface Classes : NSObject { Student *stu; } @end
但是使用@class要注意些问题:1. #import 是导入一个头文件,获取该头文件中类的定义-方法和属性;而 @class 仅仅只是告诉编译器其他地方已经定义了这么一个类,具体这个类是如何定义的,有哪些方法,属性,当前文件是不知道的,所以如果A类继承B类,我们就不能在A类中用@class B,而是必须用#import,因为A类继承B类,在A类的头文件中必须知道B类有什么方法和属性;
2.在头文件里要使用其他类,一般用@class, 在实现文件(.m文件)中用#import导入头文件,比如上面的例子,Classes类中要使用Student类的方法,就要在Classes类中的.m文件中#import Student类的头文件:
Student类:
#import <Foundation/Foundation.h> #import "Classes.h" @interface Student : NSObject { Classes *theClass; } - (void) study; @end
#import "Student.h" @implementation Student - (void)study{ NSLog(@"开始学习."); } @end
Classes类:
#import <Foundation/Foundation.h> //#import "Student.h" //使用 @class 解决相互导入问题 @class Student; @interface Classes : NSObject { Student *stu; } @end
#import "Classes.h" //在实现文件(.m文件)中用#import导入头文件 #import "Student.h" @implementation Classes - (void) test { //必须先导入导入头文件才能调用 [stu study]; } @end
Objective-C基础之@class与#import
最新推荐文章于 2019-03-21 10:16:19 发布