IOS 靜態(tài)方法與動(dòng)態(tài)方法詳解
IOS 靜態(tài)方法與動(dòng)態(tài)方法詳解
1、問(wèn)題提出
iOS中有靜態(tài)方法與動(dòng)態(tài)方法,那么兩種方法的異同是什么?
2、問(wèn)題分析
因?yàn)槊總€(gè)對(duì)象都由相應(yīng)的數(shù)據(jù)結(jié)構(gòu)與方法相構(gòu)成,一個(gè)程序可能有多個(gè)屬于同一個(gè)類(lèi)的對(duì)象,而每個(gè)對(duì)象的數(shù)據(jù)結(jié)構(gòu)應(yīng)該是不一的,但方法是相同的,若為每個(gè)對(duì)象開(kāi)辟內(nèi)存空間來(lái)存儲(chǔ)方法,必然是對(duì)內(nèi)存空間極大的浪費(fèi)。因此apple是通過(guò)類(lèi)對(duì)象與元類(lèi)來(lái)解決這個(gè)問(wèn)題的。
從根本來(lái)說(shuō),c++、objective-c、java都發(fā)源于c語(yǔ)言,因此這些語(yǔ)言實(shí)際上可以理解了經(jīng)過(guò)封裝的c語(yǔ)言,所以它們更加方便使用但效率不如c語(yǔ)言。
因此,對(duì)象的底層實(shí)際上就是結(jié)構(gòu)體,其有兩個(gè)重要的指針,一個(gè)是isa指針,一個(gè)是super指針。
isa指針:負(fù)責(zé)指向類(lèi)對(duì)象,用來(lái)表明自己是什么類(lèi)類(lèi)型,并能調(diào)用類(lèi)對(duì)象中的動(dòng)態(tài)方法。
super指針:表示對(duì)象的繼承關(guān)系,指向父類(lèi),從而能調(diào)用父類(lèi)的相應(yīng)方法。
類(lèi)對(duì)象:類(lèi)對(duì)象是由元類(lèi)生成的對(duì)象,負(fù)責(zé)存儲(chǔ)動(dòng)態(tài)方法,動(dòng)態(tài)方法在編譯器是不確定的,因此編譯器也無(wú)法檢測(cè)與動(dòng)態(tài)方法相關(guān)的錯(cuò)誤,動(dòng)態(tài)方法的調(diào)用是在運(yùn)行期中通過(guò)消息機(jī)制來(lái)執(zhí)行的,因此也只有運(yùn)行期才會(huì)報(bào)錯(cuò)。
元類(lèi):元類(lèi)是用來(lái)存儲(chǔ)靜態(tài)方法列表的,編譯器能檢測(cè)。
其整體關(guān)系如下圖所示:
結(jié)論
兩者的差異包括:(1)方法列表是區(qū)分開(kāi)的,分別存儲(chǔ)在類(lèi)對(duì)象與元類(lèi)中。
(2)動(dòng)態(tài)方法是在運(yùn)行期中調(diào)用,編譯器無(wú)法檢測(cè)錯(cuò)誤,靜態(tài)方法是在編譯器就確定,編譯器能檢測(cè)錯(cuò)誤。
(3)動(dòng)態(tài)方法由對(duì)象調(diào)用,靜態(tài)方法由類(lèi)調(diào)用,因?yàn)檎{(diào)用方法是通過(guò)isa和super指針實(shí)現(xiàn)的。因此對(duì)象只能調(diào)用類(lèi)對(duì)象的方法,而類(lèi)對(duì)像能調(diào)用元類(lèi)的方法。
3、相關(guān)代碼
(1)靜態(tài)、動(dòng)態(tài)方法創(chuàng)建對(duì)象
大部分類(lèi)的靜態(tài)方法與動(dòng)態(tài)方法中都存在相應(yīng)的方法可以用于創(chuàng)建對(duì)象,除了兩者的本質(zhì)差別,兩者的結(jié)果是無(wú)差異的,都是在堆中創(chuàng)建一個(gè)對(duì)象的內(nèi)存,并初始化好各種功能指針。 所以更加推薦使用靜態(tài)方法創(chuàng)建對(duì)象,方便編譯器檢查錯(cuò)誤和代碼風(fēng)格更簡(jiǎn)潔。從以下代碼的結(jié)果(注釋?zhuān)┲锌傻抿?yàn)證以上結(jié)論。
//tset --靜態(tài)方法與動(dòng)態(tài)方法區(qū)別探究 NSString*haha = @"luo1"; //(__NSCFConstantString *) $0 = 0x000dc054 @"luo1" NSString *hehe = [NSStringstringWithFormat:@"luo2"]; //(__NSCFString *) $1 = 0x7904a370 @"luo2" NSString *xixi = [[NSString alloc] initWithFormat:@"luo3"]; //(__NSCFString *) $2 = 0x7904a140 @"luo3"
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
相關(guān)文章
iOS如何獲取屏幕寬高、設(shè)備型號(hào)、系統(tǒng)版本信息
這篇文章主要介紹了iOS如何獲取屏幕寬高、設(shè)備型號(hào)、系統(tǒng)版本信息的相關(guān)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-11-11解決Charles抓包https時(shí),無(wú)法查看CONNECT請(qǐng)求的問(wèn)題
下面小編就為大家分享一篇解決Charles抓包https時(shí),無(wú)法查看CONNECT請(qǐng)求的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-01-01替代pod update速度慢的lg_pod_plugin安裝使用詳解
這篇文章主要介紹了替代pod update速度慢lg_pod_plugin安裝使用方式詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09iOS push側(cè)滑返回功能實(shí)現(xiàn)方法
這篇文章主要為大家詳細(xì)介紹了iOS push側(cè)滑返回功能實(shí)現(xiàn)方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-05-05iOS開(kāi)發(fā)中WebView的基本使用方法簡(jiǎn)介
這篇文章主要介紹了iOS開(kāi)發(fā)中WebView的基本使用方法,代碼基于傳統(tǒng)的Objective-C,需要的朋友可以參考下2015-11-11IOS 開(kāi)發(fā)之操作圖庫(kù)自定義控制器
這篇文章主要介紹了IOS 開(kāi)發(fā)之操作圖庫(kù)自定義控制器的相關(guān)資料,需要的朋友可以參考下2017-02-02