首页   注册   登录
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/
iOS 开发实用书单
iPhone App Development: The Missing Manual
Cocoa and Objective-C: Up and Running
Cocoa Programming for Mac OS X
深入浅出设计模式 Head First Design Patterns
Style Guides
Google Objective-C Style Guide
NYTimes Objective-C Style Guide
Useful Tools and Services
Charles Web Debugging Proxy
Smore
V2EX  ›  iDev

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

  •  
  •   xi_lin · 260 天前 · 1379 次点击
    这是一个创建于 260 天前的主题,其中的信息可能已经有所发展或是发生改变。

    自从用了 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 上也有人提了相关问题了,还未做修改

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

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

    之前加你 qq 了,你没通过
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   鸣谢   ·   1829 人在线   最高记录 3541   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.1 · 31ms · UTC 06:07 · PVG 14:07 · LAX 23:07 · JFK 02:07
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1