【問(wèn)題】WebView\\NSTimer引發(fā)的一個(gè)異步處理問(wèn)題

問(wèn)題:
當(dāng)前有一個(gè)場(chǎng)景贪庙,當(dāng)WebView接受數(shù)據(jù)的時(shí)候會(huì)觸發(fā)回調(diào),從而觸發(fā)一段特定邏輯当编,該特定邏輯是通過(guò)NSTimer延遲觸發(fā)一段與WebView相關(guān)的代碼箩绍,詳細(xì)請(qǐng)看以下的代碼塊:

... ///<WebView

NSTimer* timer = nil;
TestClass* obj;

- (void)webViewDidFinishLoad:(UIWebView *)webView
{
      [self.obj testFunction:webView];
}

... ///<TestClass

- (void)timerFunction:(UIWebView*)webView
{
      [self cancelTimer]; ///<回收Timer

      timer = [NSTimer scheduledTimerWithTimeInterval:5 
                                               target:self 
                                             selector:@selector(dealWebView:) 
                                             userInfo:webView repeats:NO]; ///<通過(guò)WebView創(chuàng)建Timer
}

- (void)cancelTimer
{
      [timer invalidate];
      [timer release];
      timer = nil;
}

- (void)dealWebView:(NSTimer*)sender
{
...
}

分析:
這里存在一個(gè)問(wèn)題,當(dāng)webView發(fā)起第一次DidFinishLoad回調(diào)的時(shí)候梳侨,NSTimer創(chuàng)建后持有了一份WebView計(jì)數(shù)廊移。在沒(méi)有執(zhí)行dealWebView函數(shù)的5秒內(nèi)醒颖,若回收WebView鲤桥,則導(dǎo)致NSTimer持有的WebView成為唯一一份計(jì)數(shù)卑吭。這時(shí)候若又來(lái)了DidFinishLoad,調(diào)用cancelTimer時(shí)丙躏,則會(huì)將WebView析構(gòu)择示,從而導(dǎo)致往下的操作都是非法操作(野指針)。

abc (1).png

一般來(lái)說(shuō)這種邏輯結(jié)構(gòu)還是比較容易解決晒旅,但很多業(yè)務(wù)是放在DidFinishLoad這個(gè)回調(diào)的里面的更深函數(shù)堆棧栅盲,則很容易出現(xiàn)這種異步析構(gòu)問(wèn)題。
根本的原因其實(shí)是webview在管理者release前废恋,沒(méi)有通知Timer進(jìn)行析構(gòu)谈秫,導(dǎo)致Timer持有了一份不安全的WebView。(為什么會(huì)是不安全鱼鼓?我們根據(jù)“誰(shuí)創(chuàng)建誰(shuí)析構(gòu)”的原則可以知道拟烫,WebView不是NSTimer創(chuàng)建,但為了確保NSTimer執(zhí)行安全迄本,故需要持有WebView硕淑,而當(dāng)WebView被管理者析構(gòu)的時(shí)候,則該WebView無(wú)論是否被析構(gòu)嘉赎,都將處于無(wú)效狀態(tài)置媳。)
解決:
方案1:在webview中設(shè)置一個(gè)變量,標(biāo)記WebView是否有效曹阔,如果無(wú)效則不處理timerFunction半开。
方案2:將webview析構(gòu)前,通知timer需要主動(dòng)析構(gòu)赃份,回收timer持有的webview計(jì)數(shù),再進(jìn)行析構(gòu)。

討論:
其實(shí)還有很多案例抓韩,如當(dāng)進(jìn)行動(dòng)畫過(guò)程的時(shí)候作用于動(dòng)畫的視圖被管理者析構(gòu)了纠永,動(dòng)畫結(jié)束后的回調(diào)可能需要對(duì)視圖進(jìn)行一些邏輯,但視圖此時(shí)處在不安全狀態(tài)谒拴,很容易產(chǎn)生Crash尝江。關(guān)鍵是當(dāng)管理者析構(gòu)對(duì)象的時(shí)候,是否應(yīng)該通知其他持有這個(gè)對(duì)象的擁有者對(duì)象失效呢英上?
具體問(wèn)題應(yīng)該具體分析炭序!
視圖正在做動(dòng)畫過(guò)程中,用戶將視圖removeFromSuperView苍日,視圖的生命周期并沒(méi)有結(jié)束惭聂,而是由動(dòng)畫對(duì)應(yīng)的block延續(xù)。視圖可能會(huì)持有1. 強(qiáng)引用模塊相恃,如子視圖 2. 弱引用模塊辜纲,如數(shù)據(jù)源。對(duì)于第一種拦耐,則在視圖真正dealloc的時(shí)候進(jìn)行回收耕腾;對(duì)于第二種,則應(yīng)該在管理者析構(gòu)視圖的時(shí)候杀糯,將弱引用提前致空扫俺,防止出現(xiàn)不安全的訪問(wèn)操作。在這個(gè)案例中固翰,對(duì)象沒(méi)有進(jìn)行dealloc時(shí)狼纬,都應(yīng)該處于生命周期中(內(nèi)存泄露除外),則應(yīng)該要保證對(duì)象所有邏輯合法安全倦挂。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末畸颅,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子方援,更是在濱河造成了極大的恐慌没炒,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,884評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件犯戏,死亡現(xiàn)場(chǎng)離奇詭異送火,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)先匪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門种吸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人呀非,你說(shuō)我怎么就攤上這事坚俗【刀ⅲ” “怎么了?”我有些...
    開封第一講書人閱讀 158,369評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵猖败,是天一觀的道長(zhǎng)速缆。 經(jīng)常有香客問(wèn)我,道長(zhǎng)恩闻,這世上最難降的妖魔是什么艺糜? 我笑而不...
    開封第一講書人閱讀 56,799評(píng)論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮幢尚,結(jié)果婚禮上破停,老公的妹妹穿的比我還像新娘。我一直安慰自己尉剩,他們只是感情好真慢,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,910評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著边涕,像睡著了一般晤碘。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上功蜓,一...
    開封第一講書人閱讀 50,096評(píng)論 1 291
  • 那天园爷,我揣著相機(jī)與錄音,去河邊找鬼式撼。 笑死童社,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的著隆。 我是一名探鬼主播扰楼,決...
    沈念sama閱讀 39,159評(píng)論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼美浦!你這毒婦竟也來(lái)了弦赖?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,917評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤浦辨,失蹤者是張志新(化名)和其女友劉穎蹬竖,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體流酬,經(jīng)...
    沈念sama閱讀 44,360評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡币厕,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,673評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了芽腾。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片旦装。...
    茶點(diǎn)故事閱讀 38,814評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖摊滔,靈堂內(nèi)的尸體忽然破棺而出阴绢,到底是詐尸還是另有隱情店乐,我是刑警寧澤,帶...
    沈念sama閱讀 34,509評(píng)論 4 334
  • 正文 年R本政府宣布旱函,位于F島的核電站响巢,受9級(jí)特大地震影響描滔,放射性物質(zhì)發(fā)生泄漏棒妨。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,156評(píng)論 3 317
  • 文/蒙蒙 一含长、第九天 我趴在偏房一處隱蔽的房頂上張望券腔。 院中可真熱鬧,春花似錦拘泞、人聲如沸纷纫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)辱魁。三九已至,卻和暖如春诗鸭,著一層夾襖步出監(jiān)牢的瞬間染簇,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工强岸, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留锻弓,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,641評(píng)論 2 362
  • 正文 我出身青樓蝌箍,卻偏偏與公主長(zhǎng)得像青灼,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子妓盲,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,728評(píng)論 2 351

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,872評(píng)論 25 707
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)杂拨、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,066評(píng)論 4 62
  • 這是在沒(méi)有任何看過(guò)簡(jiǎn)介悯衬,沒(méi)有看影評(píng)弹沽,僅憑直覺(jué)寫下的影評(píng)。 僅作紀(jì)念甚亭。 剛看完這部作品贷币,黑天鵝。 看得很過(guò)癮...
    遇馮唐閱讀 374評(píng)論 0 0
  • 卓麥閱讀 113評(píng)論 0 0