iOS Runtime——objc_class的深刻了解

前言:

如今網上講解的objc_class 絕大部分是錯的。18年、19年依然不少童鞋寫着錯誤的Runtime文章發到網上,面試的時候基本絕大部分人都說着網上所謂的「正確答案」。html

1、錯誤一:

講Runloop首先要講的是objc_class,如圖: 如今網上講解的objc_class 絕大部分是錯的。18年、19年依然不少童鞋寫着錯誤的Runtime文章發到網上,面試的時候基本絕大部分人都說着網上所謂的「正確答案」。git

講Runloop首先要講的是objc_class,如圖:github

image

而後就開始講objc_class裏的super_class表示父類。。。面試

一、咱們仔細看上圖,其中有:api

#if !OBJC2 在2006年7月WWDC中,Apple發佈了「Objective-C 2.0」。2.0有不少的語法改進、runtime改進、垃圾回收機制(已廢棄)、支持64 等。app

上面「! OBJC2 」 之間的代碼是Objective-C 2.0以前1.0版本的東西。2.0已經不支持了。oop

做爲一個開發者,有一個學習的氛圍跟一個交流圈子特別重要,這是一個個人iOS交流羣:413038000,無論你是小白仍是大牛歡迎入駐 ,分享BAT,阿里面試題、面試經驗,討論技術, 你們一塊兒交流學習成長!學習

推薦閱讀

iOS開發——2020 最新 BAT面試題合集(持續更新中)

二、中間還有:3d

OBJC2_UNAVAILABLE 這句是表示Objective-C 2.0不用使用了。cdn

三、咱們從源代碼看下這些定義。

咱們能夠下載 objc4的源代碼 。

github上也有源代碼 ,不過版本偏老。因此咱們仍是以opensource.apple.com的爲準。

當前最新版本是objc4-750.1。

3.一、先看下 OBJC2_UNAVAILABLE 的定義:

image

先看註釋:

/* OBJC2_UNAVAILABLE: unavailable in objc 2.0, deprecated in Leopard */

OBJC2_UNAVAILABLE 在objc 2.0中不可用,在Leopard中棄用(不建議使用,可是還能夠用)。Leopard是2006年WWDC公開的Mac OS 系統版本。

再看裏面的代碼:

#if !defined(OBJC2_UNAVAILABLE) 判斷OBJC_ISA_AVAILABILITY這個宏是否被定義過, 若是沒有定義過, 就執行執行隨後的語句。

咱們搜索開源的文件,沒有查到它在其餘地方定義,因此這裏就算是它的定義了。 define OBJC2_UNAVAILABLE UNAVAILABLE_ATTRIBUTE

UNAVAILABLE_ATTRIBUTE 表示不可用。若是老方法不可用,還不想刪除,能夠用這個來修飾:

  • (void)testMethod UNAVAILABLE_ATTRIBUTE { }

這樣以前調用該方法的地方都會報錯。

3.二、咱們再看下 OBJC_ISA_AVAILABILITY 的定義:

咱們看 objc-api.h文件 :

image

經過上面代碼能夠看到OBJC_ISA_AVAILABILITY在OC2.0裏不建議使用(還能夠用)。

咱們再回到剛開始:

image

網上不少文章講解的圖片下面代碼 實際上並非對的。由於它們自己早就沒用了。

2、錯誤二:

有的文章發現了上面的問題,因而根據上圖 講的是objc_class 裏只有Class isa 。其實也是錯的。

由於它的完整代碼是:

image

咱們能夠看到最開始的一句是: #if !OBJC_TYPES_DEFINED 在 objc-private.h 中定義了OBJC_TYPES_DEFINED:

#define OBJC_TYPES_DEFINED 1

因此 #if !OBJC_TYPES_DEFINED 裏的代碼是無效的。你們看到的都是假象。

3、objc_object的錯誤

一樣,網上講objc_object基本都是根據代碼:

struct objc_object { Class _Nonnull isa OBJC_ISA_AVAILABILITY; };

其實他們的完整的定義是:

image

一樣用 #if !OBJC_TYPES_DEFINED 來標記這塊代碼是無效的。

4、objc_class的真實定義

實際的代碼咱們能夠從 objc-runtime-new.h 中看到:

image

上面截圖代碼不全,你們想看所有代碼能夠下載objc-runtime-new.h文件。

5、objc_object的真實定義

詳見 objc-private.h文件

image

推薦閱讀:iOS開發——2020年BAT面試題合集(持續更新中)

相關文章
相關標籤/搜索