天天看點

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
           

繼續閱讀