objective-c 關於import與@class的理解

來源:互聯網
上載者:User

objective-c中,當一個類使用到另一個類時,並且在類的標頭檔中需要建立被引用的指標時,

一、#import和@class

如下面代碼:

A.h檔案

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

為了簡單起見:A類是引用類,B類是被引用類,這裡先不考慮A類的實現檔案。

通常引用一個類有兩種辦法:

    一種是通過#import方式引入;另一種是通過@class引入;

這兩種的方式的區別在於:

1、#import方式會包含被引用類的所有資訊,包括被引用類的變數和方法;@class方式只是告訴編譯器在A.h檔案中

B *b

只是類的聲明,具體這個類裡有什麼資訊,這裡不需要知道,等實現檔案中真正要用到時,才會真正去查看B類中資訊;

2、使用@class方式由於只需要只要被引用類(B類)的名稱就可以了,而在實作類別由於要用到被引用類中的實體變數和方法,所以需要使用#importl來包含被引用類的標頭檔;

3、通過上面2點也很容易知道在編譯效率上,如果有上百個標頭檔都#import了同一個檔案,或者這些檔案依次被#improt(A->B, B->C,C->D…),一旦最開始的標頭檔稍有改動,後面引用到這個檔案的所有類都需要重新編譯一遍,這樣的效率也是可想而知的,而相對來講,使用@class方式就不會出現這種問題了;

4、對於循環相依性關係來說,比方A類引用B類,同時B類也引用A類,B類的代碼:

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

當程式運行時,編譯會報錯,


當使用@class在兩個類相互聲明,就不會出現編譯報錯。

由上可知,@class是放在interface中的,只是在引用一個類,將這個被引用類作為一個類型,在實現檔案中,如果需要引用到被引用類的實體變數或者方法時,還需要使用#import方式引入被引用類。

如:

A.m檔案

#import "A.h"#import "B.h"@implementation A......
二、#import<......>和#import "......"的區別

#import <……>導致預先處理程式只在特殊的"system"標頭檔目錄中尋找包含檔案,目前的目錄不會被搜尋。

#import "……"預先處理程式在一個或者多個檔案目錄。

轉載自:http://jordy.easymorse.com/?p=757

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.