2018-04-03-Runtime消息發(fā)送

要想一探消息發(fā)送的究竟,就不得不使用Rumtime,OC的實(shí)質(zhì)就是消息的發(fā)送,接下來我們將簡單的OC代碼以消息發(fā)送的形式進(jìn)行調(diào)用

 * Basic Messaging Primitives
 //在某些處理器上返回某些結(jié)構(gòu)體
 * On some architectures, use objc_msgSend_stret for some struct return types.

 //在某些處理器上返回float類型
 * On some architectures, use objc_msgSend_fpret for some float return types.

 //也會在某些處理器上適用如下函數(shù)返回float類型
 * On some architectures, use objc_msgSend_fp2ret for some float return types.

 //要調(diào)用objc_msgSend函數(shù),必須要將函數(shù)強(qiáng)制轉(zhuǎn)換成合適的函數(shù)指針類型才能調(diào)用。
 * These functions must be cast to an appropriate function pointer type 
 * before being called. 
 *

  • 先創(chuàng)建一個學(xué)生類Student
Student.h
  • 在.m中實(shí)現(xiàn)具體方法


    Student.m

在.m文件中有實(shí)現(xiàn)了一個eat方法,但并沒有在.h中暴露出接口,目的是在控制器中利用perform調(diào)用

OC的調(diào)用方式


OC的調(diào)用方式

接下來,我們要利用msgSend()方法來調(diào)用方法了,根據(jù)頭文件里的描述要調(diào)用objc_msgSend函數(shù),必須要將函數(shù)強(qiáng)制轉(zhuǎn)換成合適的函數(shù)指針類型才能調(diào)用:

  • 先引入objc_message頭文件:
#import <objc/message.h>
  • 進(jìn)行類型轉(zhuǎn)換
Student *stu = ((Student *(*)(id, SEL, NSString *, NSInteger))objc_msgSend)((id)[Student class], @selector(studentWithName:age:), @"小明",12);

((Student *(*)(id, SEL, NSString *, NSInteger))objc_msgSend)這就是強(qiáng)制對obj_msgSend進(jìn)行類型轉(zhuǎn)換,這是帶一個對象指針返回值和四個參數(shù)的函數(shù)指針

現(xiàn)在可以看出使用消息發(fā)送形式已經(jīng)替換了原有OC的寫法,可以正常調(diào)用


消息發(fā)送形式創(chuàng)建對象

接下來根據(jù)同樣的方式,調(diào)用study()方法,同理,對study方法的調(diào)用如上述初始化對象一樣

((void (*) (id, SEL))objc_msgSend)((id)stu, @selector(study));
study方法消息方式調(diào)用

同樣,利用消息發(fā)送機(jī)制,可以對未聲明的方法進(jìn)行調(diào)用


對未在.h文件中聲明的方法eat進(jìn)行調(diào)用
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容