Block 延長生命周期引發(fā)線程不安全的的問題

總結(jié)一下工作中遇到的問題

block 是我們工作中常用的一個東西,使用它有很多注意點,我今天聊下項目上線之后使用block引發(fā)一個崩潰問題,

1.先來了解一下block捕獲auto變量

我們知道block會將局部auto變量捕獲到內(nèi)部, 內(nèi)部會強引用變量,這樣會造成循環(huán)引用的問題,這是一個老生常談的問題了,用__weak和__unsafe_unretained 都行但是后者是不安全的,只是在對象釋放的時候__weak會將引用的對象置為nil,而__unsafe_unretained不會,這將會導(dǎo)致野指針的產(chǎn)生,,也就不多說了


解決辦法是使用__weak弱應(yīng)用他,就可以解決循環(huán)引用的問題,那么我們再來看一個現(xiàn)象,我開啟一個子線程執(zhí)行任務(wù),我進入一個界面后,在迅速返回,并且在子線程上模擬一個耗時操作,在的耗時操作的時間內(nèi)內(nèi)我們返回上一層讓我們的控制器銷毀,我們看下會發(fā)生什么事情,結(jié)果如下


由于弱應(yīng)用了self,在控制器被銷毀之后,對象被釋放了,所以無法保留,如果我們?nèi)匀幌雽ο筮M行操作,那就要對對象進行保活,如何進行蹦朊耍活我相信作為一個iOS開發(fā)者都知道的,在block內(nèi)部強引用這個變量,所以是在代碼塊(scope)里面都不會釋放,保證對象的生命周期,結(jié)果如下

本文的重點

看似很完美但是這樣寫代碼就真的沒有問題了嗎?

答案是否定的,這樣寫只能說在block塊里面任務(wù)執(zhí)行完畢時沒有任何問題的,如果你block里面操作了這個資源,剛好這個資源會在其他地方也有使用就會造成資源搶奪在可能,嚴重的會造成app崩潰影響,為了說明這個問題我來演示一下這個現(xiàn)象

控制器A Push控制器B,不做多余的操作


代碼不變的情況下我一步操作,push完控制器我立刻pop我們的上一層控制器,也就是pop到我們的控制器A,當(dāng)然我控制器A的在生命周期的方法里面移除了最后一個元素

我們看下結(jié)果


結(jié)果肯定崩潰,說明線程不安全,2個線程可以同時訪問一個資源,解決資源搶奪的方案就是加鎖,數(shù)據(jù)庫使用databaseQueue保證線程安全訪問,當(dāng)然了還有種處理方案就是不要使用強引用,弱應(yīng)用它就行了,一個nil發(fā)出的消息是不會被響應(yīng)的,如果一定要用strongSelf來達到你項目中某些需求的話,注意block持有對象的生命周期即可,做對應(yīng)的處理,

再次我要感謝bugly,如果沒有buggly,我無法發(fā)現(xiàn)這個問題產(chǎn)生的原因,雖然能意思到可能是線程不安全的問題,但是卻不知道是如何產(chǎn)生的,bugly除了可以實時的監(jiān)控崩潰,還有界面跟蹤功能,這個功能讓我精準的定位到了意識到block延長生命周期所產(chǎn)生的問題,值得一提這個異常上報的埋點功能做的真的不錯

當(dāng)然我們在項目中寫代碼肯定不會怎么寫,一定會判斷一下是否為數(shù)組越界,項目還可以hook一些崩潰的方法,比如數(shù)組 objectAtIndex 方法減少你的項目在線上的崩潰率,對返回的消息做對應(yīng)的處理,在這里我就不啰嗦了,網(wǎng)上有很多這樣的處理方式

后記:記錄這個問題希望對一些人能有所幫助

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末戳表,一起剝皮案震驚了整個濱河市忆矛,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件卷哩,死亡現(xiàn)場離奇詭異属拾,居然都是意外死亡将谊,警方通過查閱死者的電腦和手機冷溶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瓢娜,“玉大人挂洛,你說我怎么就攤上這事礼预∶呃” “怎么了?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵托酸,是天一觀的道長褒颈。 經(jīng)常有香客問我,道長励堡,這世上最難降的妖魔是什么谷丸? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮应结,結(jié)果婚禮上刨疼,老公的妹妹穿的比我還像新娘。我一直安慰自己鹅龄,他們只是感情好揩慕,可當(dāng)我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著扮休,像睡著了一般迎卤。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上玷坠,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天蜗搔,我揣著相機與錄音,去河邊找鬼八堡。 笑死樟凄,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的兄渺。 我是一名探鬼主播缝龄,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼溶耘!你這毒婦竟也來了二拐?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤凳兵,失蹤者是張志新(化名)和其女友劉穎百新,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體庐扫,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡饭望,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年仗哨,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片铅辞。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡厌漂,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出斟珊,到底是詐尸還是另有隱情苇倡,我是刑警寧澤,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布囤踩,位于F島的核電站旨椒,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏堵漱。R本人自食惡果不足惜综慎,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望勤庐。 院中可真熱鬧示惊,春花似錦、人聲如沸愉镰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽岛杀。三九已至阔拳,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間类嗤,已是汗流浹背糊肠。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留遗锣,地道東北人货裹。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像精偿,于是被迫代替她去往敵國和親弧圆。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,435評論 2 359

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

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴謹 對...
    cosWriter閱讀 11,109評論 1 32
  • 面試題參考1 : 面試題[http://www.cocoachina.com/ios/20150803/12872...
    江河_ios閱讀 1,743評論 0 4
  • __block和__weak修飾符的區(qū)別其實是挺明顯的:1.__block不管是ARC還是MRC模式下都可以使用笔咽,...
    LZM輪回閱讀 3,327評論 0 6
  • 1.設(shè)計模式是什么叶组? 你知道哪些設(shè)計模式拯田,并簡要敘述?設(shè)計模式是一種編碼經(jīng)驗甩十,就是用比較成熟的邏輯去處理某一種類型...
    龍飝閱讀 2,163評論 0 12
  • 28歲這一年突然就開始不去咖啡廳了船庇,不去酒吧吭产,不去夜店,不去Ktv鸭轮,不愛喝酒了臣淤,不跟負能量人聊天,不喜歡熬夜窃爷,不喜...
    你說我是誰呢閱讀 153評論 0 0