成人免费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數據庫

2009-08-11 14:51:11

C#數據結構與算法

2020-12-17 10:12:33

數據結構算法隊列

2009-08-11 14:43:42

C#數據結構與算法

2009-08-11 14:30:32

C#數據結構與算法

2009-08-11 14:14:42

C#數據結構與算法

2011-03-31 15:41:51

Cacti數據表結構

2023-10-31 08:51:25

數據結構存儲數據

2012-04-28 14:21:47

Java數據結構線性結構

2021-04-19 09:08:19

無向圖數據結構

2021-08-03 10:24:59

數據跳躍鏈表結構

2020-10-17 11:14:19

數據結構與算法系列

2021-05-12 14:09:35

鏈表數據結構線性結構

2020-10-21 14:57:04

數據結構算法圖形

2009-08-11 14:36:17

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

2021-06-17 09:36:07

鴻蒙HarmonyOS應用

2021-10-12 07:58:10

MySQL索引數據

2021-07-16 07:57:34

Python數據結構

2023-04-12 16:45:07

MySQL索引數據結構

2023-07-03 17:24:33

數據結構
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久久片 | 91热在线 | 久草99| 三级国产三级在线 | 91av在线免费 | 久久久久久久一区二区三区 | 天天久久 | 亚洲精品黄色 | 久久精品国产免费看久久精品 | 午夜精品久久久久久久99黑人 | 亚洲欧洲成人av每日更新 | 国产精品高潮呻吟久久久久 | 不卡视频一区 | 久久精品免费 | 一级毛片色一级 | 九九综合九九 | 欧美性猛交一区二区三区精品 | 一区在线视频 | 日韩日韩日韩日韩日韩日韩日韩 | 日韩在线观看视频一区 | 丁香六月激情 | 亚洲成年影院 | 在线a视频 | 伊人影院99 | 精品一区二区三区在线视频 | 国产真实精品久久二三区 | 亚洲影音| 久久久久久久久99精品 | 国产精品一区久久久 | 992tv人人草 久久精品超碰 | 天天干天天色 | 99久久婷婷国产综合精品电影 | 超碰97免费在线 | 国产在线中文字幕 | 国产综合精品 | 在线观看毛片网站 | 国产成人一区二区三区久久久 | 中文字幕亚洲一区 | 欧洲色| 一区二区三区亚洲 | 成人三级网址 |