Swift 方法及方法在內(nèi)存中的位置

一,定義:

一般把定義在枚舉、結(jié)構(gòu)體、類內(nèi)部的函數(shù),叫做方法。

二, 特點(diǎn):

1,方法不占用對(duì)象的內(nèi)存
2,方法的本質(zhì)就是函數(shù)
3,方法、函數(shù)都存放在代碼段

三,驗(yàn)證:

截屏2021-07-27 上午11.28.06.png

1,可以看到p對(duì)象占用32字節(jié)的內(nèi)存空間
前8個(gè)字節(jié)(0x000000010000c308):存放類型相關(guān)信息
接下來(lái)8個(gè)字節(jié)(0x0000000000000002):存放引用計(jì)數(shù)
第三個(gè)8個(gè)字節(jié)(0x000000000000000b):存放變量x(值為11)
最后8個(gè)字節(jié)(0x0000000000000016):存放變量y(值為22)

圖1.png
圖2.png
圖3.png

匯編界面查看路徑Xcode-> Debug -> Debug Workflow -> Always show Disassembly

截屏2021-07-27 下午2.48.55.png

調(diào)類中的方法,相當(dāng)于調(diào)全局方法,把類的對(duì)象傳進(jìn)去。并且不管全局方法還是類里的方法在內(nèi)存中只存在一份,某個(gè)類的多個(gè)對(duì)象調(diào)用方法,都是訪問(wèn)的同一個(gè)方法地址。
方法不會(huì)像類的變量,每個(gè)對(duì)象的變量可能需要存儲(chǔ)不同的值。方法都是一樣的,所以存在一份就夠了。

總結(jié):

1,從圖2和圖3可以看出,方法show(0x1000027a0)和方法show1(0x1000022f0)內(nèi)存地址挨的很近,并且和p對(duì)象的地址(0x1005207b0)隔的很遠(yuǎn),側(cè)面證明方法不在對(duì)象的內(nèi)存中。

2,
方法地址:
show1(代碼段): 0x1000022f0
show(代碼段): 0x1000027a0
全局變量(數(shù)據(jù)段): 0x10000c4e8
對(duì)象(堆空間): 0x1005207b0
局部變量(棧空間): 0x00007ffeefbff328

規(guī)律:

1,內(nèi)存地址從代碼段、數(shù)據(jù)段、堆空間、到棧空間,地址越來(lái)越大。
2,一般1后面帶4個(gè)0的地址,是代碼段和數(shù)據(jù)段。
3,一般1后面不是4個(gè)0的地址,是堆空間。
4,不是以上情況,地址很大的是??臻g。

內(nèi)存地址大致分布:

空間分布.png
截屏2021-08-02 上午9.49.28.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容