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

2017-09-07 16:08:51 +08:00
 xi_lin

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

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

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

之前加你 qq 了,你没通过

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/388949

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX