Ios 无法生产的webcore崩溃

Ios 无法生产的webcore崩溃,ios,objective-c,ipad,uiwebview,crash,Ios,Objective C,Ipad,Uiwebview,Crash,我有一个iPad应用程序,在应用商店里已经有三个月了,我收到了一些奇怪的崩溃报告,我想不出来。这些并不是那么频繁,自从发布以来已经有15-20个实例,但仍然频繁到足以让我感到困扰。崩溃略有不同(见下面的堆栈跟踪),但由于它们与WebCore有关,我猜它们与应用程序中UIWebView的使用有关,可能有一个共同的原因,尽管我不是100%肯定。该应用程序的部署目标是iOS 6.0,但iPad2、iPad3和iPadMini上会出现崩溃,仅在iOS 7上出现 应用程序中只有一个地方我在使用webvie

我有一个iPad应用程序,在应用商店里已经有三个月了,我收到了一些奇怪的崩溃报告,我想不出来。这些并不是那么频繁,自从发布以来已经有15-20个实例,但仍然频繁到足以让我感到困扰。崩溃略有不同(见下面的堆栈跟踪),但由于它们与
WebCore
有关,我猜它们与应用程序中
UIWebView
的使用有关,可能有一个共同的原因,尽管我不是100%肯定。该应用程序的部署目标是iOS 6.0,但iPad2、iPad3和iPadMini上会出现崩溃,仅在iOS 7上出现

应用程序中只有一个地方我在使用webview,用于显示来自不同来源的新闻文章网页。我有一个视图控制器,它的视图是
UIWebView
。此视图控制器的一个实例存在于整个应用程序中,每次选择一篇新文章时,现有webview都会使用新选择文章的url重新加载

基于对WebCore问题的讨论,其中一个建议的解决方案建议在控制器的
dealloc
方法中将webviews
delegate
属性设置为
nil
。不幸的是,我认为它不适用于我的情况,因为视图控制器在应用程序的生命周期内不会被解除分配。
另一个问题可能是CSS中有错误图像引用的不正确网页(loadPendingImages崩溃)。但是我还没有找到这样的页面。
此外,我仔细检查并确保在主线程上执行与webview相关的操作

车祸是

Exception Type: EXC_BAD_ACCESS 
Code: KERN_INVALID_ADDRESS
具有以下堆栈跟踪(完整跟踪)

有没有人经历过类似的车祸?如果是:
1.有没有复制它们的方法?
2.如何在不复制它们的情况下调试它们?
3.哪些解决方案解决了这些问题?


谢谢

我在一个应用程序中遇到了完全相同的问题,奇怪的是,它只出现在运行iOS 7的旧设备上。我怀疑这与他们跟不上有关

我拥有的是一个
UITableView
,其中一行将打开一个
UIViewController
,上面有一个
UIWebView
,用于定制广告。我发现,在较旧的设备上,对象和内存的空闲时间比我在其他平台上看到的要长得多。我可以很容易地在iPhone4上模拟崩溃,只需在屏幕上进出两三次。作为一个iPhone5,我花了15分钟做同样的事情,但我不能指责它

我知道你可能觉得你的控制器没有被解除锁定,但听起来好像确实是,或者某个引用被删除了,我也看到我的代理引用在这个应用程序中消失了好几次

我的建议和对我有效的方法是停止webview的执行,并尽可能将所有内容设置为
nil

在我的应用程序的一个实例中,我选择在
viewwilldiscover
回调上执行此操作,因为在我的情况下,它已从用户处消失,稍后重新创建,因此我将所有内容都按如下方式隐藏:

[webView stopLoading];

self.webView.delegate = nil;
self.webView = nil;

查看Javascript-to-Objective-C代码,如果您正在执行/调用Javascript代码,请确保该脚本不会调用对Objective-C的新调用

这是正确的用法:

Javascript >> Objective-C

Objective-C >> Javascript
这就是崩溃的原因:

Objective-C>>Javascript>>Objective-C
(这里可能会崩溃,具体取决于某些比赛条件)

解决方案是特定于您的项目代码的。但最简单的方法是将所有Javascript封装在
setTimeout()
中,以调度Javascript线程中的执行。下面是一个简单的示例,您的Objective-C代码需要执行以下脚本:

storeUserPhoneNumber("011 123 4567");
如果
storeUserPhoneNumber
函数(直接或间接)调用其主体中的Objective-C代码,则会发生崩溃。要修复此问题,只需将代码包装在setTimeout中,如下所示:

setTimeout(function() {
    storeUserPhoneNumber("011 123 4567");
}, 0);
这样做的目的是从字符串中解析Javascript代码,并将其放在函数中,该函数将在解析JS代码后在下一个事件循环中执行,并将控制释放回Objective-C


记住,您需要对所有
Objective-C>>Javascript
调用进行此修复;)

iOS 7在图形渲染方面存在几个主要问题。您试图跟踪的问题可能是操作系统级别(或SDK级别)问题。为了避免盲目猜测,有一些CSS转换或动画导致了崩溃。隔离原因的唯一希望是找到导致它的页面,即使这样,你也可能无法对此做任何事情。是的,不幸的是,我自己还没有复制它,因为我正在加载来自各种(30+)新闻来源的新闻文章,我觉得我很快就无法做到这一点。如果没有其他人对这里可能发生的事情有更好的了解,我们将不得不等待iOS 7.1,看看他们是否解决了这些问题。我一直在cordova ios7中复制这个错误,使用递归循环中的window.requestAnimationFrame来逐步设置精灵表情的动画。似乎当应用程序从长时间睡眠中醒来并尝试再次设置动画时,就会发生这种情况。不幸的是,7.1并没有解决这些问题。至少beta2没有。谢谢你的提示,西蒙。我得试试这个。不幸的是,由于我无法复制这个问题,我无法知道这是否有效,至少在我发布我的应用程序更新之前。@BotondSzékely希望它能帮助你,一个快速的方法是像我那样做,向你所有的朋友发送一条消息,并要求借用旧设备几天。我发现iPhone4的iOS7操作非常糟糕。任何人只要把上面的代码保持原样,都要小心。如果您有用户可以从具有webview的屏幕访问的屏幕,则可能会引入错误。例如,假设您有一个导航栏按钮,可以按
[webView stopLoading];

self.webView.delegate = nil;
self.webView = nil;
Javascript >> Objective-C

Objective-C >> Javascript
storeUserPhoneNumber("011 123 4567");
setTimeout(function() {
    storeUserPhoneNumber("011 123 4567");
}, 0);