【大娃一點技術(shù)】NSProxy

前言的前言

經(jīng)過一些思考和反省抵皱,感覺平時只記錄東西在腦中善榛,年紀大了,淡忘了很多呻畸。so移盆,準(zhǔn)備以此為平臺記錄下,造福自己擂错,當(dāng)然如果有讀者能夠獲益味滞,那也是極好的。

文筆不好钮呀,也不喜歡長篇大論剑鞍。講些別人沒表述的以及自己的一些領(lǐng)悟。

本人技術(shù)能力一般爽醋,可能存在理解上的錯誤蚁署,所以歡迎大家留言指正。


本文前言

NSProxy蚂四,一個特殊的存在光戈,所謂的抽象類。一班人用的很少遂赠,三年二班的其實用的也不多久妆。

一個概念性的類,近期想解決一個iPhone跷睦、iPad的適配問題筷弦,突然回想起了它。簡單介紹下,合作的同學(xué)做了2個view烂琴,一個4iPhone爹殊、一個4iPad,他們使用了同樣的function奸绷、property梗夸,就是類名不一樣,而且2者也沒有繼承關(guān)系号醉。(內(nèi)心的os就是:你這個坑我跳的爽)反症。

思路是利用一個對象,在不同的環(huán)境下指向到不同的view扣癣。如果更進一步惰帽,我想到了NSProxy憨降。當(dāng)然最終是實現(xiàn)了的父虑,本文的詳細內(nèi)容是在事后重新梳理的實現(xiàn)方式。


一授药、概述

從各種教程上大家可以理解NSProxy有以下特點:

  1. 不繼承NSObject士嚎,即不是NSObject。
  2. 遵循了NSObject協(xié)議悔叽。(和上面一點的區(qū)別自己領(lǐng)悟莱衩,繼承和協(xié)議)。
  3. 解決多繼承問題娇澎。
  4. 解決弱引用問題笨蚁。
  5. 未完待續(xù),可能存在我還不了解的點趟庄。

二括细、代碼示例

一個可用的weakProxy,用以解決NSTimer和controller之間的循環(huán)引用問題戚啥。

聲明

@interface BWeakProxy : NSProxy

+ (nonnull instancetype)proxyWithTargetObject:(nullable id)targetObject;

- (void)setTargetObject:(nullable id)targetObject;

- (nullable id)targetObject;

@end

實現(xiàn)

@implementation BWeakProxy {
    __weak id _targetObject;
}

+ (nonnull instancetype)proxyWithTargetObject:(nullable id)targetObject {
    id proxy = [self alloc];
    [proxy setTargetObject:targetObject];
    return proxy;
}

- (void)setTargetObject:(nullable id)targetObject {
    _targetObject = targetObject;
}

- (nullable id)targetObject {
    return _targetObject;
}

- (void)forwardInvocation:(NSInvocation *)invocation {
    if ([_targetObject respondsToSelector:invocation.selector]) {
        [invocation invokeWithTarget:_targetObject];
    }
}

- (NSMethodSignature *)methodSignatureForSelector:(SEL)sel {
    NSMethodSignature *signature = nil;
    if ([_targetObject respondsToSelector:sel]) {
        signature = [_targetObject methodSignatureForSelector:sel];
    } else {
        // 動態(tài)造一個 void object selector arg 函數(shù)簽名奋单。
        // 目的是返回有效signature,不要因為找不到而crash
        signature = [NSMethodSignature signatureWithObjCTypes:"v@:@"];
    }

    return signature;
}
@end

調(diào)用

[NSTimer scheduledTimerWithTimeInterval:3.0f target:[BWeakProxy proxyWithTargetObject:self] selector:@selector(timerInvoke) userInfo:nil repeats:YES];

三猫十、要點

沒有太多分析览濒,只想說說最重要的部分。

1. methodSignatureForSelector的實現(xiàn)細節(jié)

  • 有2步拖云,首先判斷了被代理對象是否含有相關(guān)的selector贷笛。如果有,你自然懂的宙项。

  • 如果沒有乏苦,那么問題來了。一般我們會返回nil杉允,而這個時候系統(tǒng)會出現(xiàn)doesnotrecognizeselector的相關(guān)錯誤邑贴。經(jīng)過猜想席里,感覺蘋果的初衷是,有實際方法就調(diào)用拢驾,沒有的話就拋異常奖磁,目的是讓用戶明確的調(diào)用。

  • 但是一般我們使用代理繁疤,希望溫柔點咖为。有就執(zhí)行,如果沒有稠腊,就不執(zhí)行躁染,別讓我crash了。所以在這里架忌,我手動建立了一個

signature = [NSMethodSignature signatureWithObjCTypes:"v@:@"];

這個signature是會被傳到后面的forwardInvocationinvocation中吞彤。不過forwardInvocation的處理我們關(guān)注的還是selector,所以這個臨時signature也沒什么作用了叹放,就是不要在意了饰恕。

2. weak target

__weak id _targetObject;
  • 這里必須是weak,否則就會循環(huán)引用了井仰。
  • 一般同學(xué)習(xí)慣使用weak的property埋嵌。不過我個人更傾向使用成員變量,理由么俱恶,我總希望暴露的東西越少越好雹嗦。

四、其他

文章寫的很潦草合是,如果你感興趣卻有疑問了罪,可以隨意留言。我會盡快完善端仰。

至于NSProxy的其他應(yīng)用比如多繼承捶惜,暫時沒有實現(xiàn),看以后的機緣了荔烧。

目前沒有g(shù)ithub吱七,之后應(yīng)該會完整工程放上去。

感謝你的閱讀鹤竭!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末踊餐,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子臀稚,更是在濱河造成了極大的恐慌吝岭,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異窜管,居然都是意外死亡散劫,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進店門幕帆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來获搏,“玉大人,你說我怎么就攤上這事失乾〕N酰” “怎么了?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵碱茁,是天一觀的道長裸卫。 經(jīng)常有香客問我,道長纽竣,這世上最難降的妖魔是什么墓贿? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮退个,結(jié)果婚禮上募壕,老公的妹妹穿的比我還像新娘调炬。我一直安慰自己语盈,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布缰泡。 她就那樣靜靜地躺著刀荒,像睡著了一般。 火紅的嫁衣襯著肌膚如雪棘钞。 梳的紋絲不亂的頭發(fā)上缠借,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天,我揣著相機與錄音宜猜,去河邊找鬼泼返。 笑死,一個胖子當(dāng)著我的面吹牛姨拥,可吹牛的內(nèi)容都是我干的绅喉。 我是一名探鬼主播,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼叫乌,長吁一口氣:“原來是場噩夢啊……” “哼柴罐!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起憨奸,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤革屠,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體似芝,經(jīng)...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡那婉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了党瓮。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片吧恃。...
    茶點故事閱讀 40,503評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖麻诀,靈堂內(nèi)的尸體忽然破棺而出痕寓,到底是詐尸還是另有隱情,我是刑警寧澤蝇闭,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布呻率,位于F島的核電站,受9級特大地震影響呻引,放射性物質(zhì)發(fā)生泄漏礼仗。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一逻悠、第九天 我趴在偏房一處隱蔽的房頂上張望元践。 院中可真熱鬧,春花似錦童谒、人聲如沸单旁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽象浑。三九已至,卻和暖如春琅豆,著一層夾襖步出監(jiān)牢的瞬間愉豺,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工茫因, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蚪拦,地道東北人。 一個月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓冻押,卻偏偏與公主長得像驰贷,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子翼雀,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,512評論 2 359

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