第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定

Runtime系列(消息轉(zhuǎn)發(fā))

標(biāo)簽:
iOS
前言

一个方法的声明必定会有与之对应的实现,如果调用了只有声明没有实现的方法会导致程序crash,而实现并非只有中规中矩的在.m里写上相同的方法名再在内部写实现代码。

正文

先来回顾一下引文中的部分内容:

当调用[receiver message]时,会触发id objc_msgSend(id self, SEL op, ...)这个函数。

receiver通过isa指针找到当前对象的class,并在class中寻找op,如果找到,调用op,如果没找到,到super_class中继续寻找,如此循环直到NSObject(引自引文)。

如果NSObject中仍然没找到,程序并不会立即crash,而是按照优先级执行下列三个方法(下列方法优先级依次递减,高优先级方法消息转发成功不会再执行低优先级方法):

1.+ resolveInstanceMethod:(SEL)sel // 对应实例方法
  + resolveClassMethod:(SEL)sel // 对应类方法
2.- (id)forwardingTargetForSelector:(SEL)aSelector
3.- (void)forwardInvocation:(NSInvocation *)anInvocation
举例

比如在ViewController.h中声明,并且不在ViewController.m中直接实现,如何确保程序正常运行

@interface ViewController : UIViewController
- (void)sayHello:(NSString *)name;

@end

resolveInstanceMethod:

以实例方法为例:

resolveInstanceMethod 1.png

说一下这个函数

class_addMethod(<#__unsafe_unretained Class cls#>, <#SEL name#>, <#IMP imp#>, <#const char *types#>)

cls表示要添加方法的类,name表示要添加方法的SEL,imp表示要添加方法的IMP,types表要添加方法的返回值和参数类型。

上篇文章已经说过SEL和IMP的异同,也许你会想这里的name和imp参数是否重复,毕竟receiver已经明确,无论通过SEL还是IMP都是可以找到对应函数\方法的。正常情况是这样,但是这里只有声明没有常规的实现,如果只有SEL会导致找不到入口,如果只有IMP会导致函数\方法名不确定。
示例中type的值为v@:@,如果不用imp_implementationWithBlock来写可能更好理解

resolveInstanceMethod 2.png

v@:@中:v对应着返回值void,第一个@对应着第一个参数类型id,:对应着第二个参数类型SEL,第二个@对应着三个参数类型NSString关于Type Encodings可参考官方文档

forwardingTargetForSelector:

forwardingTargetForSelector.png

Message.h.png

Messsage.m.png

将ViewController中调用的实例方法转移到Message中,这里很好理解无须赘述。

forwardInvocation:

forwardInvocation.png

同样,这里是将ViewController中调用的实例方法转移到Message中,只是多了一层NSInvocation包装,有利于我们做更多的事情。

點擊查看更多內(nèi)容
3人點贊

若覺得本文不錯,就分享一下吧!

評論

作者其他優(yōu)質(zhì)文章

正在加載中
移動開發(fā)工程師
手記
粉絲
7
獲贊與收藏
67

關(guān)注作者,訂閱最新文章

閱讀免費教程

感謝您的支持,我會繼續(xù)努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進(jìn)行掃碼打賞哦
今天注冊有機(jī)會得

100積分直接送

付費專欄免費學(xué)

大額優(yōu)惠券免費領(lǐng)

立即參與 放棄機(jī)會
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號

舉報

0/150
提交
取消