NSProxy

NSProxy和class NSObject平級(jí),彼此沒有繼承關(guān)系;唯一的相同點(diǎn)是它們都遵循protocol NSObject,NSProxy沒有init方法,不能直接使用,需要子類繼承,之后使用

用途

1:解決循環(huán)依賴,最典型用途解除對(duì)NSTimer對(duì)self的應(yīng)用

2:解覺向Array中添加weak指針的問題

將一個(gè)weak指針通過[array ddObject:obj]添加到數(shù)組,會(huì)對(duì)指針進(jìn)行值拷貝,并且是強(qiáng)引用,所以,將weak類型的指針加入數(shù)組,會(huì)對(duì)原對(duì)象強(qiáng)引用。解決方案就是使用NSProxy,NSProxy若持有weak對(duì)象,然后將NSProxy對(duì)象加入數(shù)組,數(shù)組對(duì)NSProxy對(duì)象強(qiáng)引用

NSProxy和NSObject轉(zhuǎn)發(fā)機(jī)制的不同

對(duì)于class NSObject而言,接收到消息后先去自身的方法列表里找匹配的 selector,如果找不到,會(huì)沿著繼承體系去 superclass 的方法列表找;如果還找不到,先后會(huì)經(jīng)過+resolveInstanceMethod:和-forwardingTargetForSelector:處理,處理失敗后,才會(huì)到-methodSignatureForSelector:/-forwardInvocation:進(jìn)行最后的掙扎

但對(duì)于NSProxy,接收 unknown selector 后,直接回調(diào)-methodSignatureForSelector:/-forwardInvocation:,消息轉(zhuǎn)發(fā)過程比class NSObject要簡單得多

NSProxy的方法調(diào)用

1 NSObject協(xié)議中的判斷方法

這些方法包括

- (BOOL)isKindOfClass:(Class)aClass;
- (BOOL)isMemberOfClass:(Class)aClass;
- (BOOL)conformsToProtocol:(Protocol *)aProtocol;
- (BOOL)respondsToSelector:(SEL)aSelector;

會(huì)在內(nèi)部調(diào)用methodSignatureForSelector:/-forwardInvocation:進(jìn)行轉(zhuǎn)發(fā),轉(zhuǎn)發(fā)到其他對(duì)象執(zhí)行,實(shí)際響應(yīng)對(duì)象是其他對(duì)象

methodSignatureForSelector走轉(zhuǎn)發(fā)流程,但是forwardInvocation沒走轉(zhuǎn)發(fā)流程,直接調(diào)用forwardInvocation轉(zhuǎn)發(fā),這些方法是

我們可以看一下調(diào)用的這些方法堆棧
可以看到在方法內(nèi)部,methodSignatureForSelector,走轉(zhuǎn)發(fā)流程


image.png

forwardInvocation不走轉(zhuǎn)發(fā)流程


image.png

2 其他NSProxy實(shí)現(xiàn)的方法

對(duì)于已經(jīng)實(shí)現(xiàn)的方法可以直接調(diào)用該方法,響應(yīng)對(duì)象是NSProxy對(duì)象

例如:NSObject協(xié)議里的方法,NSProxy如果有實(shí)現(xiàn),那么響應(yīng)對(duì)象是NSProxy本身。例如isProxy等,NSProxy基類有實(shí)現(xiàn),實(shí)際響應(yīng)對(duì)象是NSProxy對(duì)象

3 NSProxy沒實(shí)現(xiàn)的方法

NSProxy沒有實(shí)現(xiàn)的方法,經(jīng)過轉(zhuǎn)發(fā)流程methodSignatureForSelector:/-forwardInvocation:進(jìn)行轉(zhuǎn)發(fā),響應(yīng)對(duì)象是其他對(duì)象


image.png

image.png

總結(jié)一下

1NSObject協(xié)議中的上述判斷方法,NSProxy在方法內(nèi)部實(shí)現(xiàn)的時(shí)候,將消息轉(zhuǎn)發(fā)到其他對(duì)象
2 NSObject協(xié)議的其他方法,響應(yīng)對(duì)象是NSProxy自身
3 其他沒實(shí)現(xiàn)的方法,走方法轉(zhuǎn)發(fā)流程,轉(zhuǎn)發(fā)到其他對(duì)象

參考文檔:https://zhangbuhuai.com/post/nsproxy.html

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

相關(guān)閱讀更多精彩內(nèi)容

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