Objective-C基礎之@class與#import
@class其實是為了解決#import導緻的互相導入的問題而出現的,所謂互相導入,可以看下面例子:
首先建一個班級類Classes 和 一個學生類Student ,簡單點,我們假設班級中可以找到某個學生,然後學生中也可以檢視其班級,于是乎,我們立馬想到要在班級中導入學生類的頭檔案,學生中導入班級類的頭檔案,代碼如下: Student類:
Classes類:#import <Foundation/Foundation.h> #import "Student.h" @interface Classes : NSObject { Student *stu; } @end
<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
Classes類:#import "Student.h" @implementation Student - (void)study{ NSLog(@"開始學習."); } @end
#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