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ā)流程

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

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ì)象


總結(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ì)象