iOS Sharing #02 | 2019-03-30

目錄

一、類方法去哪裏找?

二、isa指針有幾種類型麼?

三、分類的方法具體是在何時添加到類的方法列表中?

四、class_addMethod()都須要什麼參數?

五、iOS消息轉發流程


一、類方法去哪裏找?

答: 見上一期《iOS Sharing #01 | 2019-03-23》第5問

五、實例方法去哪裏找?git


二、isa指針有幾種類型麼?

答: isa指針分,指針類型和非指針類型,32位只作地址保存,非嵌入式64位架構下,包含除類地址外的其餘信息。

isa指針類型


三、分類的方法具體是在何時添加到類的方法列表中?

答: 類在編譯後會以 class_ro_t 的結構把類的信息存儲在 bits 裏,運行時的 realizeClass 以後,會把 ro 中的全部信息拷貝到 bits 的 data 內,即以 class_rw_t 的形式存在,分類裏的方法即在這個時候添加到類的方法表裏,並在方法表數組的最前面

四、class_addMethod()都須要什麼參數?

答:
/** * Adds a new method to a class with a given name and implementation. * * @param cls The class to which to add a method. * @param name A selector that specifies the name of the method being added. * @param imp A function which is the implementation of the new method. The function must take at least two arguments—self and _cmd. * @param types An array of characters that describe the types of the arguments to the method. * * @return YES if the method was added successfully, otherwise NO * (for example, the class already contains a method implementation with that name). * * @note class_addMethod will add an override of a superclass's implementation, * but will not replace an existing implementation in this class. * To change an existing implementation, use method_setImplementation. */
OBJC_EXPORT BOOL class_addMethod(Class cls, SEL name, IMP imp,
const char *types)
__OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_2_0);

複製代碼
  • 給類添加一個新的方法和該方法的具體實現
  • BOOL: 返回值,YES -------方法添加成功 NO --------方法添加失敗
  • Class cls: 將要給添加方法的類,傳的類型 [類名 class]
  • SEL name: 將要添加的方法名,傳的類型 @selector(方法名)
  • IMP imp:實現這個方法的函數 ,傳的類型
    • 一、C語言寫法:(IMP)方法名
    • 二、OC的寫法:class_getMethodImplementation(self,@selector(方法名:))
  • const char *types:表示咱們要添加的方法的返回值和參數
  • "v@:@":
    • 'v'是添加方法無返回值
    • '@'表示是id(也就是要添加的類)
    • ':'表示添加的方法類型
    • '@'表示參數類型

const char *types含義表:
github

Code Meaning
c A char
i An int
s A short
l A long l is treated as a 32-bit quantity on 64-bit programs.
q A long long
C An unsigned char
I An unsigned int
S An unsigned short
L An unsigned long
Q An unsigned long long
f A float
d A double
B A C++ bool or a C99 _Bool
v A void
* A character string (char *)
@ An object (whether statically typed or typed id)
# A class object (Class)
: A method selector (SEL)
[array type] An array
{name=type...} A structure
(name=type...) A union
bnum A bit field of num bits
^type A pointer to type
? An unknown type (among other things, this code is used for function pointers)

注意:
用這個方法添加的方法是沒法直接調用的,必須用performSelector:調用。 由於performSelector是運行時系統負責去找方法的,在編譯時候不作任何校驗;若是直接調用編譯是會自動校驗。 添加方法是在運行時添加的,你在編譯的時候尚未這個本類方法,因此固然不行。數組


五、iOS消息轉發流程

答:
消息轉發機制基本分爲三個步驟:
  • 一、動態方法解析
  • 二、備用接受者
  • 三、完整轉發

代碼架構

流程

類方法: app

類方法

實例方法: ide

實例方法

詳細流程: 函數

詳細流程

感謝大佬提供的圖片。ui


倉庫

本篇相關代碼this


聯繫方式

郵箱: adrenine@163.com
spa

郵箱: holaux@gmail.com

郵箱: ledahapple@icloud.com

相關文章
相關標籤/搜索