不為人知的掃地僧-NSProxy

當(dāng)你初次進(jìn)入NSProxy文檔的時(shí)候你會發(fā)現(xiàn),這里面方法少的可憐,甚至吝嗇到連init方法都木有!

NS_ROOT_CLASS @interface NSProxy <NSObject> { Class isa; }

+ (id)alloc;
+ (id)allocWithZone:(nullable NSZone *)zone ;
+ (Class)class;

- (void)forwardInvocation:(NSInvocation *)invocation;
- (nullable NSMethodSignature *)methodSignatureForSelector: (SEL)sel

為什么說是掃地僧呢,因?yàn)樗蓴r截任何方法的實(shí)現(xiàn),即使.h方法都沒有聲明的方法,下面直奔主題。

Q:假如我有個(gè)CQTeacher類,.m里面有個(gè)方法teach:,如何在未申明的時(shí)候就可以調(diào)用,并且如何實(shí)現(xiàn)調(diào)用過程中攔截改變其參數(shù)???。

  • 創(chuàng)建一個(gè)自定義的類CQProxy繼承NSProxy在.h中添加一個(gè)方法用來將如何傳入的對象,進(jìn)行轉(zhuǎn)換。
    @interface CQProxy : NSProxy
    -(void)transformObjc:(NSObject *)objc;
    @end
  • .m文件
    //0.外界傳入的objc -(void)transformObjc:(NSObject *)objc{ self.objc = objc; }

//1.查詢該方法的方法簽名,自己沒有就去super中去找 -(NSMethodSignature *)methodSignatureForSelector:(SEL)sel{ NSMethodSignature *signature = nil; //找方法簽名 if ([self.objc methodSignatureForSelector:sel]) { signature = [self.objc methodSignatureForSelector:sel]; } else{ signature = [super methodSignatureForSelector:sel]; } return signature; }

//2.調(diào)用方法實(shí)現(xiàn)
-(void)forwardInvocation:(NSInvocation *)invocation{ if(self.objc){ //設(shè)置想要的目標(biāo)類 [invocation setTarget:self.objc]; //判斷定是否是我們想要的類型 if ([self.objc isKindOfClass:[NSClassFromString(@"CQTeacher") class]]) { //這里,就是攔截參數(shù),設(shè)置成我們想要的參數(shù),即不管外界傳的什么參數(shù),我們傳入的參數(shù)永遠(yuǎn)是iOS NSString *str = @"iOS"; //下標(biāo) 0,1都被占用了。 我們設(shè)置參數(shù)必須從2開始 [invocation setArgument:&str atIndex:2]; } //開始調(diào)用 [invocation invoke]; } }

看完自定義的CQProxy實(shí)現(xiàn)后,我們就可以來測試下是否可調(diào)用 攔截,我們在控制器中創(chuàng)建CQTeacher類的對象,然后進(jìn)行轉(zhuǎn)換

CQTeacher *teacher = [[CQTeacher alloc] init]; //沒有init方法 只需要alloc即可。 CQProxy *proxy = [CQProxy alloc]; //轉(zhuǎn)換類 [proxy transformObjc:teacher]; //即使我們傳入的是java打印的卻是iOS //即使我們并沒在好.h申明方法,依舊可以調(diào)用 [proxy performSelector:@selector(teach:) withObject:@"java"];

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

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

  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 2,051評論 0 9
  • 我們常常會聽說 Objective-C 是一門動態(tài)語言,那么這個(gè)「動態(tài)」表現(xiàn)在哪呢?我想最主要的表現(xiàn)就是 Obje...
    Ethan_Struggle閱讀 2,333評論 0 7
  • 本文詳細(xì)整理了 Cocoa 的 Runtime 系統(tǒng)的知識,它使得 Objective-C 如虎添翼,具備了靈活的...
    lylaut閱讀 866評論 0 4
  • 轉(zhuǎn)載:http://yulingtianxia.com/blog/2014/11/05/objective-c-r...
    F麥子閱讀 832評論 0 2
  • 參考鏈接: http://www.cnblogs.com/ioshe/p/5489086.html 簡介 Runt...
    樂樂的簡書閱讀 2,249評論 0 9

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