最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

IOS 實(shí)現(xiàn)一個死鎖導(dǎo)致 UI 假死的例子

 更新時間:2016年12月30日 16:25:17   投稿:lqh  
這篇文章主要介紹了IOS 實(shí)現(xiàn)一個死鎖導(dǎo)致 UI 假死的例子的相關(guān)資料,需要的朋友可以參考下

IOS 實(shí)現(xiàn)一個死鎖導(dǎo)致 UI 假死的例子

現(xiàn)象

當(dāng) APP 啟動一段時間后(約半小時左右),經(jīng)常會發(fā)現(xiàn) App 界面出現(xiàn)“凍死”的現(xiàn)象。同時后臺輸出:

[CocoaGoPush]WorkThreadProc end

這時 App 呈現(xiàn)“假死”狀態(tài),點(diǎn)擊屏幕任何地方?jīng)]有反應(yīng),iPhone 除了開屏關(guān)屏無任何響應(yīng)(包括按 Home 鍵),當(dāng)然也無法解鎖(但可以重啟)。如果用 Xcode 終止應(yīng)用程序,則 iPhone 又恢復(fù)正常。

注:App 使用了 CocoaGoPush 框架。

發(fā)現(xiàn)

原來以為是程序主線程中產(chǎn)生了死循環(huán),導(dǎo)致 UI 無反應(yīng)。但當(dāng)我點(diǎn)擊 Debug 工具欄中的 Pause 按鈕,列出當(dāng)前運(yùn)行的線程時,則發(fā)現(xiàn)問題并不是這樣,而是用于死鎖。調(diào)試暫停后,斷點(diǎn)停在了這一句:

app.gopushLock.lock()// MARK: yhy removed 這行導(dǎo)致主線程死鎖

app.gopushLock 是一個 NSRecursiveLock 對象:

let gopushLock = NSRecursiveLock()

NSRecursiveLock 是遞歸鎖,該類鎖可以在同一線程多次請求一個鎖時,不會引起死鎖。但如果程序員錯誤地在兩個線程中使用了遞歸鎖,則很容易導(dǎo)致“死鎖”出現(xiàn):兩個線程同時對同一個鎖進(jìn)行加鎖,同時發(fā)現(xiàn)該鎖已經(jīng)鎖定,彼此等待對方解鎖,導(dǎo)致兩個線程都無法執(zhí)行下去。尤其是有一方是主線程的情況下,主線程被阻塞,UI 呈現(xiàn)假死狀態(tài)。在這個例子中還發(fā)現(xiàn),gopush 所在的線程也停止了,不再繼續(xù)監(jiān)聽 gopush 消息和維持心跳。

檢查代碼發(fā)現(xiàn),代碼在另一個地方使用了這個遞歸鎖:

NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue(), completionHandler:{
      (response, data, error) -> Void in

      if (error != nil) {
        app.gopushLock.lock()
        app.isGoPushFetchingMessage = false
        app.gopushLock.unlock()
        println("-----------GoPush Message Guard fail to fetch offline message. err = \(error.localizedDescription)-----------")
        ...
 })

NSURLConection.sendAysnchronousRequest 方法導(dǎo)致請求在新的線程中發(fā)送,因此 app.gopushLock.lock() 實(shí)際上是在子線程中調(diào)用的。而另外一處(第一段代碼)則是在主線程中調(diào)用的,因此導(dǎo)致了“競爭”。

解決

方法一

將主線程中的遞歸鎖調(diào)用注釋,只留下子線程中的遞歸鎖調(diào)用。

方法二

在主線程中采用不同的鎖,比如重新定義一個 NSLock 專門用于主線程,和子線程中的 gopushLock 區(qū)別開來。

方法三

將 gopushLock 的類型由 NSRecursiveLock 改為 NSLock。顧名思義,遞歸鎖專門用于循環(huán)或遞歸中需要同步的代碼,但它卻不能避免兩個線程同時訪問鎖中代碼的情況。而 NSLock 卻恰恰相反,它能避免兩個線程同時訪問鎖中的代碼,卻不能避免在同一線程中,同步代碼中嵌套加鎖的情況。檢查第二段調(diào)用遞歸鎖的情況,發(fā)現(xiàn)這里根本沒有必要使用遞歸鎖,因?yàn)榇a中既沒有遞歸也沒有循環(huán)。因此可以放心地將 gopushLock 修改為 NSLock 而不是 NSRecursiveLock。

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

您可能感興趣的文章:

相關(guān)文章

  • iOS 11 使用兩種方法替換(Method Swizzling)去掉導(dǎo)航欄返回按鈕的文字

    iOS 11 使用兩種方法替換(Method Swizzling)去掉導(dǎo)航欄返回按鈕的文字

    這篇文章主要介紹了iOS 11 使用方法替換(Method Swizzling)去掉導(dǎo)航欄返回按鈕的文字,需要的朋友可以參考下
    2018-05-05
  • 淺談關(guān)于如何檢測iOS14本地網(wǎng)絡(luò)權(quán)限的一些思路

    淺談關(guān)于如何檢測iOS14本地網(wǎng)絡(luò)權(quán)限的一些思路

    這篇文章主要介紹了淺談關(guān)于如何檢測iOS14本地網(wǎng)絡(luò)權(quán)限的一些思路,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • iOS開發(fā)之XLForm的使用方法

    iOS開發(fā)之XLForm的使用方法

    這篇文章主要介紹了iOS開發(fā)之XLForm的使用方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-07-07
  • 簡單好用可任意定制的iOS Popover氣泡效果

    簡單好用可任意定制的iOS Popover氣泡效果

    Popover(氣泡彈出框/彈出式氣泡/氣泡)是由一個矩形和三角箭頭組成的彈出窗口,箭頭指向的地方通常是導(dǎo)致Popover彈出的控件或區(qū)域。本文通過實(shí)例代碼給大家介紹了iOS Popover氣泡效果,需要的朋友參考下吧
    2017-12-12
  • iOS指紋識別的簡單應(yīng)用

    iOS指紋識別的簡單應(yīng)用

    這篇文章主要為大家詳細(xì)介紹了iOS指紋識別的簡單應(yīng)用,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-07-07
  • iOS中的緩存計(jì)算和清除完整實(shí)例代碼

    iOS中的緩存計(jì)算和清除完整實(shí)例代碼

    iOS設(shè)備使用時間長了,一些應(yīng)用程序的緩存垃圾文件就會越存越多,這些文件堆積多了就會拖慢系統(tǒng)速度。因此,小編整理了iOS中的緩存計(jì)算和清除實(shí)例
    2017-04-04
  • Flutter CustomPaint自定義繪畫示例詳解

    Flutter CustomPaint自定義繪畫示例詳解

    這篇文章主要為大家介紹了Flutter CustomPaint自定義繪畫示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • IOS本地日志記錄解決方案

    IOS本地日志記錄解決方案

    我們在項(xiàng)目中日志記錄這塊也算是比較重要的,有時候用戶程序出什么問題,光靠服務(wù)器的日志還不能準(zhǔn)確的找到問題。本文詳細(xì)介紹了IOS本地日志記錄解決方案。下面跟著小編一起來看下吧
    2017-03-03
  • iOS tableView實(shí)現(xiàn)搜索功能

    iOS tableView實(shí)現(xiàn)搜索功能

    這篇文章主要為大家詳細(xì)介紹了iOS tableView實(shí)現(xiàn)搜索功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • IOS UITableViewCell詳解及按鈕點(diǎn)擊事件處理實(shí)例

    IOS UITableViewCell詳解及按鈕點(diǎn)擊事件處理實(shí)例

    這篇文章主要介紹了IOS UITableViewCell詳解及按鈕點(diǎn)擊事件處理實(shí)例的相關(guān)資料,這里附有示例代碼,大家可以看下如何實(shí)現(xiàn)按鍵點(diǎn)擊事件,需要的朋友可以參考下
    2016-12-12

最新評論

永州市| 陕西省| 长白| 浦城县| 梧州市| 湖南省| 西藏| 射阳县| 昔阳县| 理塘县| 韶山市| 亳州市| 房山区| 海安县| 中卫市| 合阳县| 鞍山市| 昌宁县| 合作市| 肃宁县| 大悟县| 天门市| 疏附县| 日土县| 安福县| 内乡县| 赤壁市| 房产| 鄂伦春自治旗| 苍梧县| 红原县| 大新县| 延寿县| 宁阳县| 德惠市| 樟树市| 东台市| 八宿县| 酒泉市| 尉氏县| 景德镇市|