日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

Runtime之IMP指针,isa指针

發(fā)布時(shí)間:2025/4/14 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Runtime之IMP指针,isa指针 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

要了解 isa 指針先了解下類的定義
在xcode中用快捷鍵Shift+Cmd+O 搜索objc.h 能看到類的定義:
了解


Paste_Image.png

可以看出:
objc_object:Objective-C對(duì)對(duì)象的定義, 其質(zhì)上是結(jié)構(gòu)體對(duì)象,其中 isa是它唯一的私有成員變量,即所有對(duì)象都有isa指針
Class 是一個(gè) objc_class 結(jié)構(gòu)類型的指針
id是一個(gè) objc_object 結(jié)構(gòu)類型的指針,這也是id可以指向任何對(duì)象的原因
SEL(方法選擇器)是一個(gè)objc_selector結(jié)構(gòu)類型的指針
IMP 先不提

再搜runtime.h


Paste_Image.png

每個(gè)對(duì)象結(jié)構(gòu)體的首個(gè)成員是Class類的變量,該變量定義了對(duì)象所屬的類,通常稱為isa指針

super_class:父類,如果該類已經(jīng)是最頂層的根類,那么它為NULL。
version:類的版本信息,默認(rèn)為0
info:供運(yùn)行期使用的一些位標(biāo)識(shí)。
instance_size:該類的實(shí)例變量大小
ivars:成員變量的數(shù)組
struct objc_method_list **methodLists OBJC2_UNAVAILABLE : 方法列表,類目就是通過它添加方法的

struct objc_cache *cache OBJC2_UNAVAILABLE : 方法緩存,對(duì)象接到一個(gè)消息會(huì)根據(jù)isa指針查找消息對(duì)象,這時(shí)會(huì)在methodLists中遍歷,如果cache了,常用的方法調(diào)用時(shí)就能夠提高調(diào)用的效率。

struct objc_protocol_list *protocols OBJC2_UNAVAILABLE : 協(xié)議鏈表

?

isa 指針優(yōu)化(NONPOINTER_ISA)

用 64 bit 存儲(chǔ)一個(gè)內(nèi)存地址顯然是種浪費(fèi),畢竟很少有那么大內(nèi)存的設(shè)備。于是可以優(yōu)化存儲(chǔ)方案,用一部分額外空間存儲(chǔ)其他內(nèi)容。isa 指針第一位為 1 即表示使用優(yōu)化的 isa 指針,這里列出不同架構(gòu)下的 64 位環(huán)境中 isa 指針結(jié)構(gòu):

union isa_t {isa_t() { }isa_t(uintptr_t value) : bits(value) { }Class cls;uintptr_t bits; #if SUPPORT_NONPOINTER_ISA # if __arm64__ # define ISA_MASK 0x00000001fffffff8ULL # define ISA_MAGIC_MASK 0x000003fe00000001ULL # define ISA_MAGIC_VALUE 0x000001a400000001ULL struct { uintptr_t indexed : 1; uintptr_t has_assoc : 1; uintptr_t has_cxx_dtor : 1; uintptr_t shiftcls : 30; // MACH_VM_MAX_ADDRESS 0x1a0000000 uintptr_t magic : 9; uintptr_t weakly_referenced : 1; uintptr_t deallocating : 1; uintptr_t has_sidetable_rc : 1; uintptr_t extra_rc : 19; # define RC_ONE (1ULL<<45) # define RC_HALF (1ULL<<18) }; # elif __x86_64__ # define ISA_MASK 0x00007ffffffffff8ULL # define ISA_MAGIC_MASK 0x0000000000000001ULL # define ISA_MAGIC_VALUE 0x0000000000000001ULL struct { uintptr_t indexed : 1; uintptr_t has_assoc : 1; uintptr_t has_cxx_dtor : 1; uintptr_t shiftcls : 44; // MACH_VM_MAX_ADDRESS 0x7fffffe00000 uintptr_t weakly_referenced : 1; uintptr_t deallocating : 1; uintptr_t has_sidetable_rc : 1; uintptr_t extra_rc : 14; # define RC_ONE (1ULL<<50) # define RC_HALF (1ULL<<13) }; # else // Available bits in isa field are architecture-specific. # error unknown architecture # endif // SUPPORT_NONPOINTER_ISA #endif };

SUPPORT_NONPOINTER_ISA 用于標(biāo)記是否支持優(yōu)化的 isa 指針,其字面含義意思是 isa 的內(nèi)容不再是類的指針了,而是包含了更多信息,比如引用計(jì)數(shù),析構(gòu)狀態(tài),被其他 weak 變量引用情況。判斷方法也是根據(jù)設(shè)備類型:

#if !__LP64__ || TARGET_OS_WIN32 || TARGET_IPHONE_SIMULATOR || __x86_64__ # define SUPPORT_NONPOINTER_ISA 0 #else # define SUPPORT_NONPOINTER_ISA 1 #endif

isa指針會(huì)判斷是否支持 TaggedPointer 支持會(huì)直接將其指針值作為引用計(jì)數(shù)返回

TaggedPointer 就是一種優(yōu)化方式,當(dāng)承載內(nèi)容小于8字節(jié)時(shí),指針直接儲(chǔ)存承載內(nèi)容

關(guān)于Tagged Pointer 這里有詳細(xì)介紹
http://www.infoq.com/cn/articles/deep-understanding-of-tagged-pointer/

如果當(dāng)前設(shè)備是 64 位環(huán)境并且使用 Objective-C 2.0(5s之后就都是64位),那么“一些”對(duì)象會(huì)使用其 isa 指針的一部分空間來存儲(chǔ)它的引用計(jì)數(shù);否則 Runtime 會(huì)使用一張散列表來管理引用計(jì)數(shù)

64位中isa 指針中變量對(duì)應(yīng)的含義:


Paste_Image.png

associate object : 關(guān)聯(lián)對(duì)象

?

IMP 指針


Paste_Image.png

SEL會(huì)依據(jù)方法名生成唯一的表示作為key ,便于查找

IMP指針是指向?qū)崿F(xiàn)函數(shù)的指針,通過SEL取得IMP,objc_msgSend來執(zhí)行實(shí)現(xiàn)方法

objc_msgSend函數(shù)在執(zhí)行方法時(shí)不會(huì)直接在 isa 指針指向的類的方法列表中遍歷查找能夠響應(yīng)的方法,因?yàn)槊看味家檎倚侍土?#xff0c;而是優(yōu)先在緩存(方法列表)中查找,若是找不到再沿著繼承體向上查找。每次匹配到的結(jié)果會(huì)緩存在"快速映射表"里,來提高效率,同時(shí)objc_msgSend函數(shù)用到了"尾調(diào)用優(yōu)化技術(shù)",來節(jié)約資源,感興趣可以了解下
https://en.wikipedia.org/wiki/Tail_call
http://kb.cnblogs.com/page/518771/


//引用文章
http://www.cocoachina.com/ios/20151209/14636.html
http://www.cocoachina.com/ios/20150717/12623.html
http://www.cnblogs.com/ioshe/p/5489086.html

?

轉(zhuǎn)載于:https://www.cnblogs.com/LifeTechnologySupporter/p/6741943.html

總結(jié)

以上是生活随笔為你收集整理的Runtime之IMP指针,isa指针的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。