ios中@class和 #import區別,

來源:互聯網
上載者:User

ios中@class和 #import區別,

很多剛開始學習iOS開發的同學可能在看別人的代碼的時候會發現有部分#import操作寫在m檔案中,而h檔案僅僅使用@class進行聲明,不禁納悶起來,為什麼不直接把#import放到h檔案中呢?
這是因為h檔案在修改後,所有import該h檔案的所有檔案必須重 新build,因此,如果把#import寫在h檔案中,import該h檔案的檔案也就會產生不必要的編譯,增加編譯時間,特別是在專案檔多的情況 下。想象一下,如果只是修改一個h檔案而導致上百個檔案不必要的編譯,那是一件多麼讓人糾結的事情。。。
對於@class只是告訴編譯器有這個class,請不要報錯或警告,因此不會給編譯造成影響。
什麼時候用@class這種方式聲明比#import好呢?
stackoverflow上的高手們給了不少建議:
Randy Marsh:
When I develop, I have only three things in mind that never cause me any problems.
    1.    Import super classes
    2.    Import parent classes (when you have children and parents)
    3.    Import classes outside your project (like in frameworks and libraries)
For all other classes (subclasses and child classes in my project self), I declare them via forward-class.
 
Justin:
Simple answer: You #import or #include when there is a physical dependency. Otherwise, you use forward declarations (@class MONClass ,struct MONStruct , @protocol MONProtocol ).
Here are some common examples of physical dependence:
    •    Any C or C++ value (a pointer or reference is not a physical dependency). If you have aCGPoint as an ivar or property, the compiler will need to see the declaration ofCGPoint .
    •    Your superclass.
    •    A method you use. (樓主英文不好,希望大牛自行翻譯)
下面來說一下#import同class之間的區別
     在ios中我們經常會在.h和.m中引入一些類啊等等一般用的是#import來進行聲明,你們可能也見到在.h檔案進用@class來聲明的,那麼#import和@class進行聲明 到底有什麼的區別呢?下面我來說說
  1.import會包含這個類的所有資訊,包括實體變數和方法,而@class只告訴編 譯器,聲明的類的名稱,至於這些類是如何定義的,暫時不用考慮,後面會再告訴你,所以在標頭檔中如果用@class聲明某個類後,在.m的實現中如果用到聲明類的具體方法或變數時還得再#import類  
2.在.h標頭檔中進行聲明時用#import的話,如果100個標頭檔都#import同一個頭件,或者這些檔案是依次引用的,如 A->B,B->C,C->D,當最開始的那個標頭檔有變化後進行編譯時間,後面所有引用它的類都需要重新編譯,如果引用最開始的標頭檔 的類很多的話,那麼這將耗費大量的時間,而用@class則不會,可能有人會想即然.h只是用@class只是簡單的一個聲明告編譯器有這個類不讓其報錯,那麼.m中要用到引入的類的方法和屬性時,不還是要#import標頭檔一次,是的這個是對的,但編譯器編譯的時候只編譯標頭檔的,所以你的.m中用#import與編譯時間沒太大關係
3.接下來說說什麼時候該用@class,什麼時候該用#import進行聲明,
  (1)一般如果有繼承關係的用#import,如B是A的子類那麼在B中聲明A時用#import
  (2) 另外就是如果有循環相依性關係,如:A->B,B->A這樣相互依賴時,如果在兩個檔案的標頭檔中用#import分別聲明對方,那麼就會出現標頭檔迴圈利用的錯誤,這時在標頭檔中用@class聲明就不會出錯
 (3)還有就是自訂代理的時候,如果在標頭檔中想聲明代理的話如@interface


iOS編程 Objective-C class中的property問題

第一種方法在implementation裡面也會有@sythesize name;這種寫法其實是@sythesize name = name的縮寫,@sythesize XXX = YYY的意思是,自動為類的執行個體變數YYY產生getter,setter訪問函數,產生的函式宣告是getXXX(),setXXX(xxx)。另外也可以用簡單的.操作符來訪問和賦值,與訪問函數等效
 
iOS 怎判斷對象是什類

[object isKindOfClass:[NSObject class]];
傳回值是BOOL類型

NSObject替換成你想要的類名就可以了
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.