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
ainopara
V2EX  ›  iDev

用 Fabric 收集到了奇怪的 UIWebView 内部出现问题导致崩溃的记录

  •  
  •   ainopara ·
    ainopara · 2015-12-13 20:54:41 +08:00 · 5043 次点击
    这是一个创建于 3257 天前的主题,其中的信息可能已经有所发展或是发生改变。

    如图所示, UIWebView 在调用 delegate 的时候崩溃,原因是访问了无效的地址。
    这个问题只在 iOS9 的设备上出现,可按理说这里不会出现崩溃,苹果在实现这个方法的时候,也在发送消息前做了检查。
    如果只有我这里有这个问题,肯定还是哪里写的不标准触到了 iOS9 的 bug ,如果大家都见到了,那可能还是苹果的 UIKit 自己的问题。有点好奇,这个 UIWebView 在 iOS9 设备上的 Crash 记录大家都能见到吗?
    第 1 条附言  ·  2015-12-13 23:39:07 +08:00

    相关方法的伪代码, Crash 会发生在其中哪里呢?
    22 条回复    2017-09-14 13:12:24 +08:00
    SeanChense
        1
    SeanChense  
       2015-12-13 22:53:00 +08:00
    访问到了被释放的内存
    今天也遇到一个,最后检查发现是 NSString 被声明成 assign 了
    ainopara
        2
    ainopara  
    OP
       2015-12-13 23:01:09 +08:00 via iPhone
    @SeanChense 这里完全不涉及我的代码,看上去能让 app 在这个位置崩溃,只可能是 UIWebView 的 delegate 指针变成了 nil 但仍然向其发送了消息?
    SeanChense
        3
    SeanChense  
       2015-12-13 23:03:44 +08:00
    @ainopara 向 nil 发送消息是安全的。
    11
        4
    11  
       2015-12-13 23:04:26 +08:00   ❤️ 1
    @ainopara 可是向 nil 发送消息是安全的。。
    SeanChense
        5
    SeanChense  
       2015-12-13 23:12:07 +08:00 via iPhone
    你的 WebView 是怎么加载资源的?
    访问链接还是加载一段给定的 html 字符串?
    ainopara
        6
    ainopara  
    OP
       2015-12-13 23:22:54 +08:00
    @SeanChense
    @11
    这样一来,问题就更奇怪了。。
    ainopara
        7
    ainopara  
    OP
       2015-12-13 23:29:53 +08:00
    @SeanChense 你提醒我了,我的 app 里既使用了前者,也存在后者。
    而且在 Crash 信息中还看不出来是哪一个。个人感觉给定字符串的情况出问题的可能行比较小。
    SeanChense
        8
    SeanChense  
       2015-12-13 23:50:08 +08:00
    @ainopara 非也,我觉得给传参传一个字符串然后出这个问题反而可能性大。
    就像我今天碰到的一样 property 声明成 assign ,再从对象总取出来插入数据库的时候就出现这个问题了。
    11
        9
    11  
       2015-12-13 23:51:33 +08:00
    @ainopara 附言里的是用的什么软件?
    ainopara
        10
    ainopara  
    OP
       2015-12-14 08:13:34 +08:00
    @11 Hopper Disassembler v3
    ainopara
        11
    ainopara  
    OP
       2015-12-14 08:17:03 +08:00
    @SeanChense 有道理,比如向 delegate 发送了消息,而 delegate 已经不存在了却没有变为 nil 。
    或者向 delegate 发送消息附带的参数出现你说的情况。
    另外观察发现,崩溃时同时还存在这种线程:
    com.apple.coremedia.player.async
    AVAudioSession Notify Thread
    怀疑和浏览器中的视频播放有关。
    skylancer
        12
    skylancer  
       2015-12-14 09:53:38 +08:00   ❤️ 1
    这个好像是已知的问题,好像是出在视频解码上
    SeanChense
        13
    SeanChense  
       2015-12-14 10:36:40 +08:00 via iPhone   ❤️ 1
    @ainopara 没有实际代码不好分析,你可以用 NSZombie 定位查一下
    ainopara
        14
    ainopara  
    OP
       2015-12-14 11:17:24 +08:00
    @skylancer 如果是这样,就确认是苹果的问题了。之前主要是担心是自己配置 UIWebView 的时候没做好导致的。

    @SeanChense 有实际代码也不好分析,因为我没办法复现这个崩溃问题,我自己用的时候也从来没遇到过。。只能靠 Fabric 收集到的记录推测。
    11
        15
    11  
       2015-12-14 11:27:14 +08:00   ❤️ 1
    @ainopara 看看有没有其他线程访问数据之类的?
    ainopara
        16
    ainopara  
    OP
       2015-12-14 13:30:30 +08:00
    @11 没有,其他线程基本都是
    __psynch_cvwait + 8
    mach_msg_trap + 8
    这种状态。
    我猜测是过去的某个步骤传入了错误的数据,当时没访问数据,但执行到这里需要访问了才崩溃的。
    numbbuaa
        17
    numbbuaa  
       2016-01-01 22:35:06 +08:00   ❤️ 1
    感觉是 UIWebView 的 delegate (比如 VC )被释放了,建议最好在 delegate 类的 dealloc 方法里面把 UIWebView 的 delegate 置成 nil
    ainopara
        18
    ainopara  
    OP
       2016-02-06 20:43:12 +08:00
    @SeanChense
    @11
    @skylancer
    @numbbuaa
    最终问题解决了。解决方案在这里:
    http://stackoverflow.com/questions/29139034/iosexc-bad-access-for-webview-delegate
    最终通过 dealloc 的时候向 webview 发送 stopLoading 消息解决了。( delegate 设置为 nil 这个之前有做过,但是不配合 stopLoading 一起用并不能消除这种 Crash )
    SeanChense
        19
    SeanChense  
       2016-02-06 21:03:45 +08:00   ❤️ 1
    @ainopara 哈哈,恭喜恭喜。
    skylancer
        20
    skylancer  
       2016-02-07 00:05:04 +08:00   ❤️ 1
    @ainopara 恭喜
    xi_lin
        21
    xi_lin  
       2017-09-14 12:45:35 +08:00
    @numbbuaa delegate 这种 weak reference 的东西应没影响吧
    ainopara
        22
    ainopara  
    OP
       2017-09-14 13:12:24 +08:00 via iPhone
    @xi_lin 怀疑是 UIKit 内部某些实现用了 unowned 而不是 weak 保留了 delegate。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1062 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 75ms · UTC 19:36 · PVG 03:36 · LAX 11:36 · JFK 14:36
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.