V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
iOS 开发实用技术导航
NSHipster 中文版
http://nshipster.cn/
cocos2d 开源 2D 游戏引擎
http://www.cocos2d-iphone.org/
CocoaPods
http://cocoapods.org/
Google Analytics for Mobile 统计解决方案
http://code.google.com/mobile/analytics/
WWDC
https://developer.apple.com/wwdc/
Design Guides and Resources
https://developer.apple.com/design/
Transcripts of WWDC sessions
http://asciiwwdc.com
Cocoa with Love
http://cocoawithlove.com/
Cocoa Dev Central
http://cocoadevcentral.com/
NSHipster
http://nshipster.com/
Style Guides
Google Objective-C Style Guide
NYTimes Objective-C Style Guide
Useful Tools and Services
Charles Web Debugging Proxy
Smore
xi_lin
V2EX  ›  iDev

对 NSURLSessionTask 的 state 属性做 KVO 可能会造成 crash

  •  
  •   xi_lin · 2017-09-07 16:08:51 +08:00 · 4769 次点击
    这是一个创建于 2665 天前的主题,其中的信息可能已经有所发展或是发生改变。

    自从用了 Texture(原来的 ASDK)以后,顺便把图片请求库换成了 PINRemoteImage,结果在 Fabric 上看到 crash 数量大量增长。最多的就是如下这种:

    Crashed: com.apple.NSURLSession-work
    0  CoreFoundation                 0x18bb67d9c CFDictionaryGetValue + 76
    1  Foundation                     0x18c74ceb8 _NSSetLongLongValueAndNotify + 72
    2  CFNetwork                      0x18c2b4fa4 -[__NSCFLocalSessionTask _task_onqueue_didFinish] + 428
    3  CFNetwork                      0x18c2b7708 -[__NSCFLocalSessionTask connection:didFinishLoadingWithError:] + 72
    4  CFNetwork                      0x18c36d298 __51-[__NSCFURLLocalSessionConnection _task_sendFinish]_block_invoke + 136
    5  CFNetwork                      0x18c36d204 -[__NSCFURLLocalSessionConnection _task_sendFinish] + 88
    6  libdispatch.dylib              0x18ab4a9e0 _dispatch_call_block_and_release + 24
    7  libdispatch.dylib              0x18ab4a9a0 _dispatch_client_callout + 16
    8  libdispatch.dylib              0x18ab58ad4 _dispatch_queue_serial_drain + 928
    9  libdispatch.dylib              0x18ab4e2cc _dispatch_queue_invoke + 884
    10 libdispatch.dylib              0x18ab5aa50 _dispatch_root_queue_drain + 540
    11 libdispatch.dylib              0x18ab5a7d0 _dispatch_worker_thread3 + 124
    12 libsystem_pthread.dylib        0x18ad53100 _pthread_wqthread + 1096
    13 libsystem_pthread.dylib        0x18ad52cac start_wqthread + 4
    

    搜了一圈,发现 14 年的时候 AFNetworking 也出现过类似问题

    总结起来就是 libdispatch 的实现估计有问题,在多线程 racing 的情况下对 state 用 KVO 有概率造成 crash

    AFNetworking 最后用了 method swizzle 来实现对 state 变化的观察,见此

    PINRemoteImage 上也有人提了相关问题了,还未做修改

    第 1 条附言  ·  2017-09-07 19:30:36 +08:00
    8 条回复    2017-09-18 12:37:52 +08:00
    kitalphaj
        1
    kitalphaj  
       2017-09-07 18:26:23 +08:00
    感谢分享。话说用了 ASDK 的感受可以说一下么?要真实感受,不要夸张 ;)
    xi_lin
        2
    xi_lin  
    OP
       2017-09-07 19:29:58 +08:00
    @kitalphaj 挺好用的,特别是用 flex 布局,写起来比 auto layout 更灵活一些,而且不用考虑重用的时候各种条件样式的问题。
    在 table 中用的时候要注意下数据模型的线程安全,不要在 reload 的时候改数据。
    workhardupc
        3
    workhardupc  
       2017-09-14 09:40:48 +08:00
    @xi_lin 解决后,线上验证了吗?
    xi_lin
        4
    xi_lin  
    OP
       2017-09-14 09:58:43 +08:00
    @workhardupc 今天刚过审,等几天看看数据
    workhardupc
        5
    workhardupc  
       2017-09-14 16:00:02 +08:00
    @xi_lin 好的,我们也遇到这个问题,有结果后给说下,谢谢
    workhardupc
        6
    workhardupc  
       2017-09-14 20:11:49 +08:00
    @xi_lin 方便加 QQ 沟通下吗?我的 QQ:403758652
    workhardupc
        7
    workhardupc  
       2017-09-18 12:10:56 +08:00
    @xi_lin 数据咋样了?

    我们这边是只有 iOS10 的系统有这个问题?你们是否也是这样?
    xi_lin
        8
    xi_lin  
    OP
       2017-09-18 12:37:52 +08:00
    @workhardupc 数据不错,这几天都没有这个 crash 了。
    我是把 kvo 给删了,因为没用到 progressive 这个功能
    https://github.com/xilin/PINRemoteImage/tree/kvo-workaround

    之前加你 qq 了,你没通过
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5188 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 01:20 · PVG 09:20 · LAX 17:20 · JFK 20:20
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.