iOS -NSProxy

@interface NSProxy <NSObject> {
    Class   isa;
}

@interface NSObject <NSObject> {
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wobjc-interface-ivars"
    Class isa  OBJC_ISA_AVAILABILITY;
#pragma clang diagnostic pop
}

可以看到固该,它遵守了 NSObject 協(xié)議头谜,并且第一個 Ivar 是一個 isa 指針煞聪,因此它完全是可以拿來當一個 NSObject 或其派生類來使用的雾棺。

NSProxy 的使用也非常簡單膊夹,通常,你只需要實現(xiàn)兩個方法:

- (void)forwardInvocation:(NSInvocation *)invocation;
- (nullable NSMethodSignature *)methodSignatureForSelector:(SEL)sel NS_SWIFT_UNAVAILABLE("NSInvocation and related APIs not available");

image

例子轉(zhuǎn)自Cyandev
首先垢村,我們需要準備一個實體類割疾,它可以是任意一個類,甚至是系統(tǒng)類庫所提供的類嘉栓,這里我們用 NSURL 類來開刀宏榕。

@interface MyProxy : NSProxy {
    id _object;
}

+ (id)proxyForObject:(id)obj;

@end


@implementation MyProxy

+ (id)proxyForObject:(id)obj {
    MyProxy *instance = [MyProxy alloc];
    instance->_object = obj;
    
    return instance;
}

- (NSMethodSignature *)methodSignatureForSelector:(SEL)sel {
    return [_object methodSignatureForSelector:sel];
}

- (void)forwardInvocation:(NSInvocation *)invocation {
    if ([_object respondsToSelector:invocation.selector]) {
        NSString *selectorName = NSStringFromSelector(invocation.selector);
        
        NSLog(@"Before calling \"%@\".", selectorName);
        [invocation invokeWithTarget:_object];
        NSLog(@"After calling \"%@\".", selectorName);
    }
}

@end

作者:Cyandev
鏈接:http://www.reibang.com/p/a7187e014c03
來源:簡書
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán)侵佃,非商業(yè)轉(zhuǎn)載請注明出處麻昼。

這是我們的 Proxy 簡單實現(xiàn),我們需要持有一個被代理對象的引用馋辈,然后將消息轉(zhuǎn)發(fā)到這個對象上抚芦,在轉(zhuǎn)發(fā)之前和以后我們就可以做自己想做的事情了。

methodSignatureForSelector: 方法需要獲取一個方法簽名迈螟,用來生成 NSInvocation叉抡,我們直接將這個調(diào)用轉(zhuǎn)發(fā)到被代理對象中。緊接著答毫,forwardInvocation: 會被調(diào)用褥民,將 NSInvocation 用被代理對象調(diào)用。我們就可以在這個方法里做一些手腳洗搂,比如埋點計數(shù)等消返。在這個例子中,我只是簡單地將對象所調(diào)用的方法的 selector 打印出來耘拇。

然后我們看看用于測試的主函數(shù):

int main(int argc, char *argv[]) {
    dispatch_semaphore_t sem = dispatch_semaphore_create(0);
    
    NSURL *url = [MyProxy proxyForObject:[NSURL URLWithString:@"https://www.google.com"]];
    NSURLSessionDataTask *task = [[NSURLSession sharedSession] dataTaskWithURL:url completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        dispatch_semaphore_signal(sem);
    }];
    
    [task resume];
    dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);
    
    return 0;
}

作者:Cyandev
鏈接:http://www.reibang.com/p/a7187e014c03
來源:簡書
著作權(quán)歸作者所有撵颊。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處惫叛。

就是簡單構(gòu)造一個 NSURL倡勇,只不過我們先用了 MyProxy 封裝代理后傳給 NSURLSession 去使用,輸出結(jié)果如下:


image

也就是說嘉涌,系統(tǒng)用 NSURL 的 absoluteURL 屬性來獲取真正的 URL 數(shù)據(jù)妻熊,至此我們就已經(jīng)可以跟蹤已有類的行為了,甚至還可以通過 [NSThread callStackSymbols] 來跟蹤調(diào)用改方法的函數(shù)調(diào)用棧:


image
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末洛心,一起剝皮案震驚了整個濱河市固耘,隨后出現(xiàn)的幾起案子题篷,更是在濱河造成了極大的恐慌词身,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件番枚,死亡現(xiàn)場離奇詭異法严,居然都是意外死亡损敷,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門深啤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來拗馒,“玉大人,你說我怎么就攤上這事溯街∮展穑” “怎么了?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵呈昔,是天一觀的道長挥等。 經(jīng)常有香客問我,道長堤尾,這世上最難降的妖魔是什么肝劲? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮郭宝,結(jié)果婚禮上辞槐,老公的妹妹穿的比我還像新娘。我一直安慰自己粘室,他們只是感情好榄檬,可當我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著育特,像睡著了一般丙号。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上缰冤,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天犬缨,我揣著相機與錄音,去河邊找鬼棉浸。 笑死怀薛,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的迷郑。 我是一名探鬼主播枝恋,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼嗡害!你這毒婦竟也來了焚碌?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤霸妹,失蹤者是張志新(化名)和其女友劉穎十电,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡鹃骂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年台盯,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片畏线。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡静盅,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出寝殴,到底是詐尸還是另有隱情蒿叠,我是刑警寧澤,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布蚣常,位于F島的核電站栈虚,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏史隆。R本人自食惡果不足惜魂务,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望泌射。 院中可真熱鬧粘姜,春花似錦、人聲如沸熔酷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拒秘。三九已至号显,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間躺酒,已是汗流浹背押蚤。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留羹应,地道東北人揽碘。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像园匹,于是被迫代替她去往敵國和親雳刺。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,901評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉裸违,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 1,682評論 0 9
  • 目錄 Objective-C Runtime到底是什么 Objective-C的元素認知 Runtime詳解 應(yīng)用...
    Ryan___閱讀 1,933評論 1 3
  • *面試心聲:其實這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個offer,總結(jié)起來就是把...
    Dove_iOS閱讀 27,125評論 29 470
  • 先看下NSObject繼承圖. 說明:本來想翻譯一下 但是英語水平有限,怕翻譯的會誤導(dǎo)大家,最終直接原文展示本篇包...
    你好自己閱讀 2,650評論 1 15
  • 本教程為python3文檔解讀 本教程面向完全型小白掖桦,只要你會在電腦上打字,那你就可以看懂供汛。 參考視頻觀看枪汪,味道更...
    咖喱py閱讀 902評論 0 22