日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

@class #import辨析 #include

發(fā)布時(shí)間:2023/12/10 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 @class #import辨析 #include 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

?解析:

? ? ? ?很多剛開始學(xué)習(xí)iOS開發(fā)的同學(xué)可能在看別人的代碼的時(shí)候會(huì)發(fā)現(xiàn)有部分#import操作寫在 .m 文件中,而 .h 文件僅僅使用@class進(jìn)行聲明,不禁納悶起來,為什么不直接把#import放到h文件中呢?

? ? ??這是因?yàn)?.h 文件在修改后,所有 #import 該 .h 文件的所有文件必須重 新Build,因此,如果把 #import 寫在 .h 文件中,#impor t該 .h 文件的文件也就會(huì)產(chǎn)生不必要的編譯,增加編譯時(shí)間,特別是在項(xiàng)目文件多的情況 下。想象一下,如果只是修改一個(gè) .h 文件而導(dǎo)致上百個(gè)文件不必要的編譯,那是一件多么讓人糾結(jié)的事情。。。對(duì)于@class只是告訴編譯器有這個(gè)class,請(qǐng)不要報(bào)錯(cuò)或警告,因此不會(huì)給編譯造成影響。

?

?

?

?下面來說一下#import同class之間的區(qū)別

?

?????在ios中我們經(jīng)常會(huì)在.h和.m中引入一些類啊等等一般用的是#import來進(jìn)行聲明,你們可能也見到在.h文件進(jìn)用@class來聲明的,那么#import和@class進(jìn)行聲明 到底有什么的區(qū)別呢?

?

? ? ? ? ? ?1. import會(huì)包含這個(gè)類的所有信息,包括實(shí)體變量和方法,而@class只告訴編譯器,聲明的類的名稱,至于這些類是如何定義的,暫時(shí)不用考慮,所以在頭文件中如果用@class聲明某個(gè)類后,在.m的實(shí)現(xiàn)中如果用到聲明類的具體方法或變量時(shí)還得再#import類 ?。

?

? ? ? ? ? ?2.在.h頭文件中進(jìn)行聲明時(shí)用#import的話,如果100個(gè)頭文件都#import同一個(gè)頭件,或者這些文件是依次引用的,如A->B,B->C,C->D,當(dāng)最開始的那個(gè)頭文件有變化后進(jìn)行編譯時(shí),后面所有引用它的類都需要重新編譯,如果引用最開始的頭文件的類很多的話,那么這將耗費(fèi)大量的時(shí)間,而用@class則不會(huì),可能有人會(huì)想即然.h只是用@class只是簡(jiǎn)單的一個(gè)聲明告編譯器有這個(gè)類不讓其報(bào)錯(cuò),那么.m中要用到引入的類的方法和屬性時(shí),不還是要#import頭文件一次,是的這個(gè)是對(duì)的,但編譯器編譯的時(shí)候只編譯頭文件的,所以你的.m中用#import與編譯時(shí)間沒太大關(guān)系

?

? 接下來說說什么時(shí)候該用@class,什么時(shí)候該用#import進(jìn)行聲明

?

? ? ? ? ???1.一般如果有繼承關(guān)系的用#import,如B是A的子類那么在B中聲明A時(shí)用#import

?

?? ? ? ? ? 2. 另外就是如果有循環(huán)依賴關(guān)系,如:A->B,B->A這樣相互依賴時(shí),如果在兩個(gè)文件的頭文件中用#import分別聲明對(duì)方,那么就會(huì)出現(xiàn)頭文件循環(huán)利用的錯(cuò)誤,這時(shí)在頭文件中用@class聲明就不會(huì)出錯(cuò)

?

? ? ? ? ??3.還有就是自定義代理的時(shí)候,如果在頭文件中想聲明代理的話如@interface SecondViewController:UIViewController時(shí)應(yīng)用#import不然的話會(huì)出錯(cuò)誤,注意XXXXDelegate是自定義的

?

在分析 #Imclude 和 #include的用法

?

?

#include
??????? 區(qū)分 #include <x.h>與#include "x.h"的作用
????????#include <x.h>:它用于對(duì)系統(tǒng)自帶的頭文件的引用,編譯器會(huì)在系統(tǒng)文件目錄下去查找該文件.
?????????#include "x.h":用戶自定義的文件用雙引號(hào)引用,編譯器首先會(huì)在用戶目錄下查找,然后到安裝目錄中查找,最后在系統(tǒng)文件中查找。
? ? ? ? ?在使用#include的時(shí)候要注意處理重復(fù)引用(這也是objc中#include與#import的區(qū)別)
??????? 例如:ClassA 與 ClassB同時(shí)引用了ClassC,不做重復(fù)引用處理的時(shí)候在ClassD中同時(shí)引用ClassA,ClassB編譯會(huì)提示對(duì)ClassC重復(fù)引用的錯(cuò)誤.
???????? 我們可以:#ifndef _CLASSC_H
?????????????????????? #define _CLASSC_H
?????????????????????? #include "ClassC"
?????????????????????? #endif
???????? 這樣處理在編譯時(shí)就不會(huì)有重復(fù)引用的錯(cuò)誤出現(xiàn)(在objc中#import解決了這個(gè)問題,這是它們的區(qū)別)

#import
???????? #import 大部分功能和#include是一樣的,但是他處理了重復(fù)引用的問題,我們?cè)谝梦募臅r(shí)候不用再去自己進(jìn)行重復(fù)引用處理.

@class
??????? 主要是用于聲明一個(gè)類,告訴編譯器它后面的名字是一個(gè)類的名字,而這個(gè)類的定義實(shí)現(xiàn)是暫時(shí)不用知道的,后面會(huì)告訴你.也是因?yàn)樵?#64;class僅僅只是聲明一個(gè)類,所以在后面的實(shí)現(xiàn)文件里面是需要去#import這個(gè)類,這時(shí)候才包含了這個(gè)被引用的類的所有信息。

綜上所述#include,#import與@class的區(qū)別可以做一下理解:
? ? ? ???#include與#import在引用一個(gè)類的時(shí)候會(huì)包含這個(gè)類的所有信息包括變量方法等,但是這樣做會(huì)對(duì)編譯效率造成影響.比如有99個(gè)類都#import了ClassA,那么在編譯的時(shí)候這99個(gè)類都會(huì)去對(duì)ClassA處理.又比如A被B引用,B被C引用,C被D引用.....此時(shí)如果A被修改,那么后面的B,C,D.....都需要重新進(jìn)行編譯.還有一個(gè)用法會(huì)引起編譯錯(cuò)誤的就是在ClassA中#import ClassB 在ClassB中#import ClassA那么在編譯的時(shí)候也會(huì)出現(xiàn)未知錯(cuò)誤。
??????? 所以一般來說,在interface中引用一個(gè)類,就用@class,它會(huì)把這個(gè)類作為一個(gè)類型來使用,而在實(shí)現(xiàn)這個(gè)interface的文件中,如果需要引用這個(gè)類的實(shí)體變量或者方法之類的,還是需要import這個(gè)在@class中聲明的類。

轉(zhuǎn)載于:https://www.cnblogs.com/Sucri/p/5262215.html

總結(jié)

以上是生活随笔為你收集整理的@class #import辨析 #include的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。