OC之@class

假設有兩個類,一個是Card,一個是Person,當Card中包含Person,咱們就須要在Card前加上#import 「Person.h「。若是此時Person中再包含Card的話,咱們就又得在Person類前加上#import 「Card.h」。這時再編譯運行就會出現故障,由於編譯運行會致使兩個類不停得拷貝對方,致使報錯。面試

這是能夠在兩個類前用:spa

@class .net

就能夠避免這種問題,好比在Person中用@class Card;代替#import 「Card.h」。在Card中用@class Person;代替#import 「Person.h」。可是這樣仍是有一個問題,它僅僅告訴編譯器某個名稱是一個類,並無把這個類中的全部東西拷貝過來。在實際開發中:開發

(1) 在.h文件中用@class來聲明類get

(2) 在.m文件中用#import來包含類的全部東西編譯器

@class #import的區別(高頻面試題)編譯

對於循環依賴關係來講,好比A類引用B類,同時B類也引用A類:class


這種代碼會報錯,當時用@class在兩個類中互相聲明,就不會編譯報錯。效率

(1)#import方式會包含被引用類的全部信息,包括被引用類的變量和方法;@class方式只是告訴編譯器在A.h文件中B *b只是類的聲明,具體這個類有什麼信息,這裏不須要知道,等實現文件中真正要用到時,纔會去查看B類中信息。import

(2)若是有上百個頭文件都#import了同一個文件,或者這些文件依次被#import,那麼一旦最開始的頭文件稍有改動,後面引用這個文件的全部類都要從新編譯一遍,這樣對效率的影響也是可想而知的。相對來說,使用@class方式就不會出現這種問題了。

(3)在.m實現文件中,若是須要引用到被引用類的屍體變量或者方法時,還須要使用#import方式引用被引用類。

相關文章
相關標籤/搜索