首页
/
每日頭條
/
圖文
/
runtime 返回值獲取
runtime 返回值獲取
更新时间:2026-06-09 17:16:25

  簡介 Runtime 又叫運行時,是一套底層的 C 語言 API,其為 iOS 内部的核心之一,我們平時編寫的 OC 代碼,底層都是基于它來實現的。比如:

  [receiver message]; // 底層運行時會被編譯器轉化為: objc_msgSend(receiver, selector) // 如果其還有參數比如: [receiver message:(id)arg...]; // 底層運行時會被編譯器轉化為: objc_msgSend(receiver, selector, arg1, arg2, ...)

  以上你可能看不出它的價值,但是我們需要了解的是 Objective-C 是一門動态語言,它會将一些工作放在代碼運行時才處理而并非編譯時。也就是說,有很多類和成員變量在我們編譯的時是不知道的,而在運行時,我們所編寫的代碼會轉換成完整的确定的代碼運行。

  因此,編譯器是不夠的,我們還需要一個運行時系統(Runtime system)來處理編譯後的代碼。

  Runtime 基本是用 C 和彙編寫的,由此可見蘋果為了動态系統的高效而做出的努力。蘋果和 GNU 各自維護一個開源的 Runtime 版本,這兩個版本之間都在努力保持一緻。

  點擊[這裡](http://www.opensource.apple.com/source/objc4/)下載蘋果維護的開源代碼。

  runtime 返回值獲取(程序員眼中的黑魔法)(1)

  Runtime 的作用 Objc 在三種層面上與 Runtime 系統進行交互:

  1. 通過 Objective-C 源代碼

  2. 通過 Foundation 框架的 NSObject 類定義的方法

  3. 通過對 Runtime 庫函數的直接調用

  Objective-C 源代碼 多數情況我們隻需要編寫 OC 代碼即可,Runtime 系統自動在幕後搞定一切,還記得簡介中如果我們調用方法,編譯器會将 OC 代碼轉換成運行時代碼,在運行時确定數據結構和函數。

  通過 Foundation 框架的 NSObject 類定義的方法 Cocoa 程序中絕大部分類都是 NSObject 類的子類,所以都繼承了 NSObject 的行為。(NSProxy 類時個例外,它是個抽象超類)

  一些情況下,NSObject 類僅僅定義了完成某件事情的模闆,并沒有提供所需要的代碼。例如 `-description` 方法,該方法返回類内容的字符串表示,該方法主要用來調試程序。NSObject 類并不知道子類的内容,所以它隻是返回類的名字和對象的地址,NSObject 的子類可以重新實現。

  還有一些 NSObject 的方法可以從 Runtime 系統中獲取信息,允許對象進行自我檢查。例如:

  -class方法返回對象的類;-isKindOfClass:和 -isMemberOfClass:方法檢查對象是否存在于指定的類的繼承體系中(是否是其子類或者父類或者當前類的成員變量);-respondsToSelector:檢查對象能否響應指定的消息;-conformsToProtocol:檢查對象 是否實現了指定協議類的方法;-methodForSelector:返回指定方法實現的地址。通過對 Runtime 庫函數的直接調用 Runtime 系統是具有公共接口的動态共享庫。頭文件存放于/usr/include/objc目錄下,這意味着我們使用時隻需要引入`objc/Runtime.h`頭文件即可。

  許多函數可以讓你使用純 C 代碼來實現 Objc 中同樣的功能。除非是寫一些 Objc 與其他語言的橋接或是底層的 debug 工作,你在寫 Objc 代碼時一般不會用到這些 C 語言函數。

  Runtime深入講解——Aspects 源碼解析

  AOP 即面向切面編程,初次接觸 AOP 的人可能會困惑,到底什麼是 AOP。舉個簡單的列子,一般随着業務和産品的發展,産品需要在頁面中加入自己的頁面統計。這個時候我們會怎麼做?面向對象的思想是這些統計功能很多頁面都會用到,每個 VC 寫一次特别麻煩,于是所有的 VC 都繼承自一個基類。而且随着項目的增大,一般我們會把一些常用的功能寫成組件的形式來使用,這時就抽取出來的功能可能就要依賴這個基類,抽取的時候就比較難受。所以這個時候 AOP 就可以完美的解決這個問題,對于 OC 來說,我們可以直接 Method-Swizzling 來 Hook 當前的 viewWillAppear 和 viewWillDisappear 然後統計信息。但是這種簡單的 Method-Swizzling 其實存在一定的安全隐患。

  Aspects 是一個使用簡單的 AOP 庫,适用于 iOS 和 OS X

  在本節課當中我們可以學習到作者是如何設計這個庫,以及在 Hook 過程中處理了很多可能發生的隐患問題。同樣這裡面涉及到很多 Runtime 的知識,絕對是學習進階的好資料。

  知識點:

  1、Aspects 類結構分析2、Aspects 核心原理講解3、Aspects 流程分析關于本次在線直播發布 一、直播時間

  2018年12月25日晚上20:00

  二、主講人

  Kody老師

  三、加入直播

  私信回複“06”通過小編驗證後即可獲得參加線上直播以及課前資料。

  runtime 返回值獲取(程序員眼中的黑魔法)(2)

  ,

Comments
Welcome to tft每日頭條 comments! Please keep conversations courteous and on-topic. To fosterproductive and respectful conversations, you may see comments from our Community Managers.
Sign up to post
Sort by
Show More Comments
推荐阅读
廣積糧緩稱王子
廣積糧緩稱王子
高築牆,廣積糧,緩稱王對明太祖朱元璋的功過評說,曆來都褒貶不一。但對他白手起家,推翻元蒙的曆史功績,卻始終是有口皆碑,為後人傳頌的。朱元璋為什麼能從“草寇”起家,而最終完成推翻一個王朝,并建立另一個王朝的曆史使命呢?究其原因,促其成大事的指...
2026-06-09
火龍果帶果肉能發芽嗎
火龍果帶果肉能發芽嗎
火龍果太貴了,留1點“果肉”埋土裡,7天就發芽,來年結果吃不完不少人在平時喜歡吃火龍果,火龍果含有着豐富的營養價值,能夠促進消化,還能夠使人們變得更加年輕,但是火龍果的價格比較貴,在生活中都是以多少錢一個計算的,所以并不是一個人經常能吃得起...
2026-06-09
張家界鄉村文化旅遊
張家界鄉村文化旅遊
紅網時刻張家界6月24日訊(通訊員董明勤)“我們班坐的是青龍号,你們坐的是什麼号電車啊?”“快看,那裡有猴子!”“你們答對了幾道題啊?”6月24日上午,伴随着孩子們的歡聲笑語,近300名師生來到張家界十裡畫廊景區,開啟一天的研學之旅。6月以...
2026-06-09
夏天怎麼吃姜冬天才能不冷
夏天怎麼吃姜冬天才能不冷
人們常說:“冬吃蘿蔔夏吃姜”。那麼夏天吃姜有哪些講究?各地不同的姜又有什麼樣的特點呢?快跟随四位專家一起來看看吧!萊蕪生姜李時珍在《本草綱目》中描述生姜:“可蔬、可和、可果、可藥,其利博也”。在烹制雞、鴨、魚、肉時加入生姜,可以使得菜品味道...
2026-06-09
濰柴英緻737ev還在生産嗎
濰柴英緻737ev還在生産嗎
[汽車點評·鄭州]2015年12月11日,濰柴旗下全新MPV車型英緻737鄭州上市會在中原萬達舉行,新車提供1.5L共計7款車型選擇,售價區間為5.68-9.98萬元。外觀部分,英緻737外形設計給人第一感覺比較協調,不呆闆,前臉使用了與英...
2026-06-09
Copyright 2023-2026 - www.tftnews.com All Rights Reserved