之前換工作饼灿,有家公司福利待遇各方面都特別滿意,十分想去帝美,但是面試碰到個(gè)問(wèn)題碍彭,讓我尷尬了,雖然本人到目前為止從事iOS開發(fā)三年多,但大多獨(dú)立開發(fā)硕旗,這問(wèn)題還真沒(méi)深入去考慮過(guò)窗骑。下面我具體講講遇到的問(wèn)題。
首先漆枚,那個(gè)公司的項(xiàng)目要自己開發(fā)統(tǒng)計(jì)的sdk创译,不用第三方庫(kù),主要是考慮到數(shù)據(jù)安全的問(wèn)題墙基,這其實(shí)沒(méi)什么软族,自己開發(fā)就自己開發(fā)吧,然后残制,面試官問(wèn)我開發(fā)這個(gè)sdk的思路是什么立砸,應(yīng)該怎么去做,然后我滔滔不絕的把友盟統(tǒng)計(jì)的實(shí)現(xiàn)原理與步驟吧啦吧啦講講一遍初茶,但是颗祝,他緊接著就問(wèn)我一個(gè)問(wèn)題,說(shuō):你不覺(jué)得這樣做恼布,耦合度很高嗎螺戳?統(tǒng)計(jì)的代碼分散在工程的各個(gè)角落,維護(hù)或修改起來(lái)多麻煩折汞?當(dāng)時(shí)我就震驚了……what倔幼?……你如果要統(tǒng)計(jì)按鈕點(diǎn)擊次數(shù),你不在按鈕實(shí)現(xiàn)方法里加個(gè)統(tǒng)計(jì)的代碼爽待,那要怎么做呢损同?因?yàn)閺膩?lái)沒(méi)考慮過(guò)這方面的問(wèn)題,所以當(dāng)時(shí)我的腦子是空白的鸟款。
理所當(dāng)然的面試失敗膏燃,回到家,我痛定思痛何什,深入研究了一下蹄梢,在這里寫一下我的心得,有不對(duì)的地方希望留言指正富俄。
首先傳統(tǒng)統(tǒng)計(jì),例如友盟而咆,他有以下幾個(gè)缺點(diǎn):
1.復(fù)用性差霍比,這部分埋點(diǎn)代碼很難給其他項(xiàng)目復(fù)用,復(fù)用性基本為零
2.工作量大暴备,尤其在頁(yè)面較多時(shí)悠瞬,需要修改的代碼也多
3.引入“臟代碼”,不易維護(hù),尤其是稍微大一點(diǎn)的app浅妆,這樣的代碼幾乎遍地都是 (這里的臟代碼指的是用戶行為分析這種業(yè)務(wù)其實(shí)跟主業(yè)務(wù)沒(méi)有關(guān)系望迎,不應(yīng)該保持如此高的耦合度,因?yàn)檫@些代碼會(huì)干擾我們對(duì)項(xiàng)目主業(yè)務(wù)的維護(hù))
因此凌外,采用這種傳統(tǒng)的代碼辩尊,雖然直觀,方便康辑,但是在可復(fù)用性以及可維護(hù)性來(lái)說(shuō)摄欲,有很大的缺陷。我在網(wǎng)上看了很多的博客論壇之類的疮薇,總結(jié)一下可以用runtime來(lái)有效的解決這一問(wèn)題胸墙。
由于Runtime知識(shí)不屬于本文的重點(diǎn),這里只簡(jiǎn)單介紹按咒。
在iOS中迟隅,我們可以在運(yùn)行時(shí)替換兩個(gè)方法的實(shí)現(xiàn),達(dá)到“勾住”某個(gè)方法并注入代碼的目的励七。具體做法是:
重載類的“+(void)load”方法智袭,在程序加載到內(nèi)存時(shí)利用Runtime的method_exchangeImplementations等接口將方法(設(shè)為M)的實(shí)現(xiàn)互相交換。當(dāng)方法M被調(diào)用時(shí)就會(huì)被勾住(Hook)呀伙,執(zhí)行我們的方法补履。
這種技術(shù)也稱為Method Swizzling,屬于面向切面編程(Aspect-Oriented Programming)的一種實(shí)現(xiàn)剿另。
簡(jiǎn)書里不知道怎么粘貼代碼箫锤,我復(fù)制粘貼過(guò)來(lái)的都湊成一團(tuán)了,所以我在CSDN上寫完了雨女,想看的可以點(diǎn)擊鏈接進(jìn)去看? 我的博客? 谚攒。喜歡的點(diǎn)贊,有問(wèn)題的留言氛堕,共同探討共同進(jìn)步馏臭。