調(diào)用系統(tǒng)相機(jī),點(diǎn)擊拍照, 發(fā)現(xiàn)只能長按才可以,點(diǎn)擊無響應(yīng)览露。

問題描述:
調(diào)用系統(tǒng)相機(jī)蔚晨,點(diǎn)擊拍照, 發(fā)現(xiàn)只能長按才可以,點(diǎn)擊無響應(yīng)。

排查的結(jié)果是:
重寫了一個button 的類別 ,導(dǎo)致拍照時的Button事件出現(xiàn)問題

結(jié)論:
在項(xiàng)目中謹(jǐn)慎為系統(tǒng)類添加分類

如下作者做了很詳細(xì)的說明:
1肛循、堅決杜絕為系統(tǒng)類做方法交換(見到【class_replaceMethod】格殺勿論!)

2银择、為系統(tǒng)類添加分類時候多糠,屬性和方法名必須加上【世上獨(dú)一無二】的前綴,避免沖突和混淆浩考。
之所以讓我對上述行為恨之入骨是因?yàn)榧锌祝裉鞛榱艘粋€bug,我花了將近半天時間苦苦追尋原因析孽。

我只是使用了一個簡簡單單的UIImagePickerController的拍照的功能界面搭伤,奇葩的現(xiàn)象是,點(diǎn)擊快門按鈕時---可以看見界面中的按鈕發(fā)生了視覺上的響應(yīng)袜瞬,但是卻沒有功能上的響應(yīng)(按道理怜俐,我這邊按下按鈕的時候,拍照就會完成輸出圖片數(shù)據(jù))邓尤。

我的整個思考過程是這樣的:

點(diǎn)擊沒功能反應(yīng)拍鲤?難道有誰把這個類中的響應(yīng)方法重寫了?

---尋找UIImagePickerController在整個項(xiàng)目中的出現(xiàn)汞扎,看有沒有對它做分類季稳,或者是子類化。結(jié)果是沒有的澈魄!

那是不是關(guān)于UIImagePickerController這個類景鼠,隨著iOS的SDK的更新,我有些屬性或者方法需要適配下痹扇?

---我用iOS10.2和iOS11.2和最新的iOS11.4都看了一遍铛漓,都有這個問題。難道從iOS10開始就要有些跟之前不一樣的適配需要做鲫构?我翻看相關(guān)的適配博客票渠,沒有發(fā)現(xiàn)!

難道是我對事件響應(yīng)鏈做了一些調(diào)整芬迄?導(dǎo)致事件被阻斷问顷?

---我回頭看了一眼UIImagePickerController對象創(chuàng)建后使用的是模態(tài)出來的,一個簡單的展示鏈,沒有問題杜窄!

難道多線程問題肠骆?

---NONONO!我核對了下代碼塞耕,整個過程都在主線程中蚀腿,至于就算UIImagePickerController里面的處理上開了子線程,那也不歸我們管扫外,它暴露出來的API肯定是在主線程的莉钙。

那就見鬼了~但是,不對啊筛谚,就這個簡單的UIImagePickerController磁玉,不至于啊驾讲!

---我應(yīng)該是知道肯定是項(xiàng)目中的其他SDK的環(huán)境影響到了它蚊伞,但是會是什么呢?為了更加確定我的這個想法吮铭,給自己繼續(xù)追尋原因的信心时迫,我新建demo,這塊代碼原樣放入谓晌。臥槽掠拳,完美運(yùn)行。

那行纸肉,我這樣的話碳想,我要一查到底!

---能夠引起這個問題的全局原因毁靶,那么就是項(xiàng)目的配置數(shù)據(jù)有誤胧奔,那么就是分類的原因。

項(xiàng)目的配置數(shù)據(jù)就是那些预吆,最多就是在info文件中說明下使用相機(jī)的原因龙填,方便獲取用戶的授權(quán)。因此我肯定拐叉,這塊沒有問題岩遗。

分類的話,我已經(jīng)確定了沒有UIImagePickerController的分類凤瘦。那么肯定就是其他系統(tǒng)類的分類了宿礁。

首先,添加分類的不可控性體現(xiàn)在:

(1)如果在分類中重寫類的方法蔬芥,分類的重寫優(yōu)先級是最高的梆靖。

(2)如果系統(tǒng)對UIImagePickerController添加了一些分類(包括不暴露在API中的)控汉,剛好又與項(xiàng)目中對其的分類方法名重復(fù),會后入為主的返吻。

(3)另外分類是會在編譯器就全部加上的姑子,如果在分類中對類本身做的處理是會影響到類本身的。也就是說测僵,如果對類中的方法做了方法轉(zhuǎn)移的處理街佑,那就無形中影響了。

于是我趕緊搜索方法轉(zhuǎn)移的class_replaceMethod方法名有沒有在項(xiàng)目中出現(xiàn)捍靠。果然沐旨,項(xiàng)目中對UIButton的分類中重寫了+load類方法,在改方法中做了方法轉(zhuǎn)移榨婆!

正如前面分析的磁携,重寫+load方法的優(yōu)先級:分類中>子類中>類本身。

并且重寫的是+load這個方法纲辽,完全可以做到悄無聲息。

為了進(jìn)一步驗(yàn)證就是這個原因璃搜,我直接將這個分類的實(shí)現(xiàn)方法注釋掉拖吼,然后運(yùn)行項(xiàng)目~【method_exchangeImplementations完美運(yùn)作!这吻!】

剛剛時候的是相當(dāng)于反編譯的方式把問題的根源找到了吊档,現(xiàn)在我需要的是使用順推的方法,把問題的出現(xiàn)原因梳理清楚唾糯。

通過查看UIButton的這個分類知道怠硼,它是將@selector(sendAction:to:forevent:)這個方法替換掉了。sendAction:to:forevent:方法中實(shí)際調(diào)用的是objc_setAssociatedObject移怯,替換后的方法香璃,在其中加了一個計時器,使得規(guī)定時間內(nèi)舟误,只能objc_setAssociatedObject調(diào)用一次葡秒。

這樣的做法,應(yīng)該是為了防止button高頻按動而做的改動嵌溢。

然而眯牧,UIImagePickerController功能界面中的快門按鈕抑钟,實(shí)際上是在拍照功能時革娄,按住快門鍵不放护奈,可以實(shí)現(xiàn)高頻連拍的功能(我試了下最多時999張)蚁飒,這樣的話徽曲,就很好解釋通了渣淤。雖然户誓,按住快門鍵按鈕不放是一個“長按”手勢尚洽,但是其內(nèi)部的實(shí)現(xiàn)肯定是高頻的調(diào)用@selector(sendAction:to:forevent:)這個方法。說到這里阀坏,我得說明下如暖,雖然長按手勢和單點(diǎn)手勢表面上的確是不一樣的,但是其內(nèi)部都調(diào)用了@selector(sendAction:to:forevent:)這個方法忌堂。因此盒至,之前寫button這個分類的目的雖然是防止用戶高頻的單擊按鈕,但是現(xiàn)在用戶雖然不是高頻的單擊士修,而是長按枷遂,但是都調(diào)用的是@selector(sendAction:to:forevent:)這個方法。畢竟棋嘲,當(dāng)初為了防止用戶高頻單擊酒唉,是替換掉了@selector(sendAction:to:forevent:)這個方法。因此沸移,謎底揭開了痪伦,整個離奇的故事真相大白~

,也可以附上我的文章出處:http://www.cnblogs.com/cchHers/

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末雹锣,一起剝皮案震驚了整個濱河市网沾,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蕊爵,老刑警劉巖辉哥,帶你破解...
    沈念sama閱讀 218,640評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異攒射,居然都是意外死亡醋旦,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,254評論 3 395
  • 文/潘曉璐 我一進(jìn)店門会放,熙熙樓的掌柜王于貴愁眉苦臉地迎上來饲齐,“玉大人,你說我怎么就攤上這事咧最÷嵴牛” “怎么了?”我有些...
    開封第一講書人閱讀 165,011評論 0 355
  • 文/不壞的土叔 我叫張陵窗市,是天一觀的道長先慷。 經(jīng)常有香客問我,道長咨察,這世上最難降的妖魔是什么论熙? 我笑而不...
    開封第一講書人閱讀 58,755評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮摄狱,結(jié)果婚禮上脓诡,老公的妹妹穿的比我還像新娘无午。我一直安慰自己,他們只是感情好祝谚,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,774評論 6 392
  • 文/花漫 我一把揭開白布宪迟。 她就那樣靜靜地躺著,像睡著了一般交惯。 火紅的嫁衣襯著肌膚如雪次泽。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,610評論 1 305
  • 那天席爽,我揣著相機(jī)與錄音意荤,去河邊找鬼。 笑死只锻,一個胖子當(dāng)著我的面吹牛玖像,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播齐饮,決...
    沈念sama閱讀 40,352評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼捐寥,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了祖驱?” 一聲冷哼從身側(cè)響起握恳,我...
    開封第一講書人閱讀 39,257評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎羹膳,沒想到半個月后睡互,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體根竿,經(jīng)...
    沈念sama閱讀 45,717評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡陵像,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,894評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了寇壳。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片醒颖。...
    茶點(diǎn)故事閱讀 40,021評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖壳炎,靈堂內(nèi)的尸體忽然破棺而出泞歉,到底是詐尸還是另有隱情,我是刑警寧澤匿辩,帶...
    沈念sama閱讀 35,735評論 5 346
  • 正文 年R本政府宣布腰耙,位于F島的核電站,受9級特大地震影響铲球,放射性物質(zhì)發(fā)生泄漏挺庞。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,354評論 3 330
  • 文/蒙蒙 一稼病、第九天 我趴在偏房一處隱蔽的房頂上張望选侨。 院中可真熱鬧掖鱼,春花似錦、人聲如沸援制。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,936評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽晨仑。三九已至褐墅,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間寻歧,已是汗流浹背掌栅。 一陣腳步聲響...
    開封第一講書人閱讀 33,054評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留码泛,地道東北人猾封。 一個月前我還...
    沈念sama閱讀 48,224評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像噪珊,于是被迫代替她去往敵國和親晌缘。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,974評論 2 355

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