要想一探消息發(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)用
