天天看点

Objective-C基础之@class与#import

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类:

#import <Foundation/Foundation.h>
//#import "Student.h"

//使用 @class 解决相互导入问题
@class Student;

@interface Classes : NSObject
{
    Student *stu;
}

@end
           

command + B 编译通过;

但是使用@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
           

继续阅读