成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Runtime系列(淺析數據結構)

移動開發
上篇文章說到類與元類,我們已經知道類的本質是結構體objc_class,接下來看看objc_class是什么

上篇文章說到類與元類,我們已經知道類的本質是結構體objc_class,接下來看看objc_class是什么

objc_class.png

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

name:類名
version:版本相關信息,默認為0
info:提供運行期使用的標示符
instance_size:當前類實例變量的大小(包括父類)

  • ivars
    從objc_class可以看到,ivars是結構體objc_ivar_list的指針

objc_ivar_list and objc_ivar.png

結構體各成員見名知意,不再逐個解釋。可見,ivars其實是一個存儲類中成員變量相關信息的鏈表。
其中

Ivar.png
  • methodLists
    從objc_class可以看到,methodLists是結構體objc_method_list的二級指針

objc_method_liist and objc_method.png

又見結構體的自嵌套,可見methodLists也是鏈表,存儲類中的方法相關信息。由于是二級指針,所以可以動態修改類中的方法,這也是分類的實現原理。
其中

Method.png

這里要解釋一下SEL和IMP:

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

來看下面的例子

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

在OC中,這樣寫會報錯,錯誤類型為重復聲明。如果這樣寫:

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

即使返回值不同,仍然是重復聲明。因為他們的方法名相同,都是helloWorld:,所以這四個方法對應著同一個SEL。
不過這是在同一個類中,如果是不同的類呢?
無論是在同一個類還是在不同的類,只要方法名相同,SEL就相同,獲取的ID就相同。

既然方法名相同ID就相同,如果兩個非繼承關系的類存在相同方法名的方法,那該如何確定執行那個類中的方法?
再來回顧引文提到的函數

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

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

  • IMP
    相比于SEL,IMP要爽快得多。IMP的本質是函數指針,直接通過IMP就可以找到各個方法。這樣效率更高,因為繞過了消息傳遞階段,直接定位。

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

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

2023-11-12 21:49:10

Redis數據庫

2020-12-17 10:12:33

數據結構算法隊列

2009-08-11 14:43:42

C#數據結構與算法

2009-08-11 14:51:11

C#數據結構與算法

2009-08-11 14:30:32

C#數據結構與算法

2009-08-11 14:14:42

C#數據結構與算法

2023-10-31 08:51:25

數據結構存儲數據

2012-04-28 14:21:47

Java數據結構線性結構

2011-03-31 15:41:51

Cacti數據表結構

2021-04-19 09:08:19

無向圖數據結構

2020-10-21 14:57:04

數據結構算法圖形

2021-05-12 14:09:35

鏈表數據結構線性結構

2021-08-03 10:24:59

數據跳躍鏈表結構

2020-10-17 11:14:19

數據結構與算法系列

2009-08-11 14:36:17

C#數據結構與算法線性表

2021-07-16 07:57:34

Python數據結構

2023-04-12 16:45:07

MySQL索引數據結構

2023-07-03 17:24:33

數據結構

2014-12-10 10:35:43

微信 數據結構

2023-10-27 07:04:20

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 狠狠操电影 | 99成人免费视频 | www.亚洲| 久久久一区二区三区四区 | 成人国产在线观看 | 久久久久久毛片免费观看 | 三级免费毛片 | 亚洲乱码一区二区三区在线观看 | 四虎永久影院 | 91九色麻豆 | 国产乱码精品1区2区3区 | 精品在线观看一区二区 | 婷婷国产一区二区三区 | 亚洲欧洲成人av每日更新 | 欧美不卡一区 | 亚洲在线观看视频 | 91精品国产91久久久 | 成人精品高清 | 欧美一区二区三区大片 | 国产精品久久久久永久免费观看 | 九色视频网 | 秋霞a级毛片在线看 | 在线国产视频 | 羞羞的视频在线看 | 国产精品视频观看 | 欧美日韩18 | 欧美日韩一 | 精品在线一区 | 欧美激情一区二区 | 国产精品无码永久免费888 | 午夜视频在线观看网址 | 国产一区二区三区 | 久久av一区 | 欧美日韩不卡在线 | 国产一区在线免费观看视频 | 日韩国产高清在线观看 | 精品丝袜在线 | 成人国产一区二区三区精品麻豆 | 伊人精品国产 | 视频一区二区中文字幕日韩 | 五月婷婷在线视频 |