自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Runtime系列(淺析數(shù)據(jù)結(jié)構(gòu))

移動(dòng)開發(fā)
上篇文章說到類與元類,我們已經(jīng)知道類的本質(zhì)是結(jié)構(gòu)體objc_class,接下來看看objc_class是什么

上篇文章說到類與元類,我們已經(jīng)知道類的本質(zhì)是結(jié)構(gòu)體objc_class,接下來看看objc_class是什么

objc_class.png

isa指向元類,super_class表示當(dāng)前類的父類,這兩個(gè)成員我們已經(jīng)很熟悉,這里不再贅述(可參考 類與元類 、 引文)。

name:類名
version:版本相關(guān)信息,默認(rèn)為0
info:提供運(yùn)行期使用的標(biāo)示符
instance_size:當(dāng)前類實(shí)例變量的大?。òǜ割悾?/p>

  • ivars
    從objc_class可以看到,ivars是結(jié)構(gòu)體objc_ivar_list的指針

objc_ivar_list and objc_ivar.png

結(jié)構(gòu)體各成員見名知意,不再逐個(gè)解釋??梢?,ivars其實(shí)是一個(gè)存儲(chǔ)類中成員變量相關(guān)信息的鏈表。
其中

Ivar.png
  • methodLists
    從objc_class可以看到,methodLists是結(jié)構(gòu)體objc_method_list的二級指針

objc_method_liist and objc_method.png

又見結(jié)構(gòu)體的自嵌套,可見methodLists也是鏈表,存儲(chǔ)類中的方法相關(guān)信息。由于是二級指針,所以可以動(dòng)態(tài)修改類中的方法,這也是分類的實(shí)現(xiàn)原理。
其中

Method.png

這里要解釋一下SEL和IMP:

  • SEL
    • 什么是SEL
      SEL是對方法的包裝,常見的定義有
      SEL sel1 = @selector(message1);
      SEL sel2 = NSSelectorFromString(message2);
    • 為什么要對方法進(jìn)行包裝
      獲取方法所對應(yīng)的ID
    • 什么是方法對應(yīng)的ID
      可以理解為方法名的一種映射

來看下面的例子

- (void)helloWorld:(int)flag;
- (void)helloWorld:(float)flag;

在OC中,這樣寫會(huì)報(bào)錯(cuò),錯(cuò)誤類型為重復(fù)聲明。如果這樣寫:

- (int)helloWorld:(int)flag;
- (float)helloWorld:(float)flag;

即使返回值不同,仍然是重復(fù)聲明。因?yàn)樗麄兊姆椒嗤?,都是helloWorld:,所以這四個(gè)方法對應(yīng)著同一個(gè)SEL。
不過這是在同一個(gè)類中,如果是不同的類呢?
無論是在同一個(gè)類還是在不同的類,只要方法名相同,SEL就相同,獲取的ID就相同。

既然方法名相同ID就相同,如果兩個(gè)非繼承關(guān)系的類存在相同方法名的方法,那該如何確定執(zhí)行那個(gè)類中的方法?
再來回顧引文提到的函數(shù)

id objc_msgSend(id self, SEL op, ...)

[receiver message]還有個(gè)接受者,即使ID相同,不同的接收者定位到的方法仍然不同,而各類中不允許存在相同方法名的方法,這樣就確定了***性。

  • IMP
    相比于SEL,IMP要爽快得多。IMP的本質(zhì)是函數(shù)指針,直接通過IMP就可以找到各個(gè)方法。這樣效率更高,因?yàn)槔@過了消息傳遞階段,直接定位。

回到objc_class。
cache和protocols不再深入,這里只做簡單介紹

  • cache
    cache同樣是鏈表,存儲(chǔ)曾經(jīng)調(diào)用過的方法的相關(guān)信息,這樣將常用方法存到cache中,可以提高方法的查找效率。
  • protocols
    protocols仍然是鏈表,存儲(chǔ)當(dāng)前類(包括父類)遵守的協(xié)議的相關(guān)信息。
責(zé)任編輯:倪明 來源: 簡書
相關(guān)推薦

2023-11-12 21:49:10

Redis數(shù)據(jù)庫

2020-12-17 10:12:33

數(shù)據(jù)結(jié)構(gòu)算法隊(duì)列

2009-08-11 14:43:42

C#數(shù)據(jù)結(jié)構(gòu)與算法

2009-08-11 14:51:11

C#數(shù)據(jù)結(jié)構(gòu)與算法

2009-08-11 14:30:32

C#數(shù)據(jù)結(jié)構(gòu)與算法

2009-08-11 14:14:42

C#數(shù)據(jù)結(jié)構(gòu)與算法

2023-10-31 08:51:25

數(shù)據(jù)結(jié)構(gòu)存儲(chǔ)數(shù)據(jù)

2011-03-31 15:41:51

Cacti數(shù)據(jù)表結(jié)構(gòu)

2012-04-28 14:21:47

Java數(shù)據(jù)結(jié)構(gòu)線性結(jié)構(gòu)

2021-04-19 09:08:19

無向圖數(shù)據(jù)結(jié)構(gòu)

2020-10-21 14:57:04

數(shù)據(jù)結(jié)構(gòu)算法圖形

2021-05-12 14:09:35

鏈表數(shù)據(jù)結(jié)構(gòu)線性結(jié)構(gòu)

2021-08-03 10:24:59

數(shù)據(jù)跳躍鏈表結(jié)構(gòu)

2020-10-17 11:14:19

數(shù)據(jù)結(jié)構(gòu)與算法系列

2009-08-11 14:36:17

C#數(shù)據(jù)結(jié)構(gòu)與算法線性表

2021-06-17 09:36:07

鴻蒙HarmonyOS應(yīng)用

2023-10-27 07:04:20

2021-07-16 07:57:34

Python數(shù)據(jù)結(jié)構(gòu)

2023-04-12 16:45:07

MySQL索引數(shù)據(jù)結(jié)構(gòu)

2023-07-03 17:24:33

數(shù)據(jù)結(jié)構(gòu)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)