UIWebView随机崩溃在[UIViewAnimationState release]:消息发送到解除分配的实例

时间:2014-10-30 14:57:23

标签: ios objective-c iphone uiwebview

我使用 iPhone5 使用 iOS8.1 UIWebView进行随机UIWebView崩溃。在我的测试中,崩溃不会出现在 iOS7

我已经创建了这个github存储库来重现崩溃: https://github.com/crarau/WebViewCrash

基本上我正在添加UIWebView并加载www.amazon.com

随机应用程序在WebThread EXC_ARM_BREAKPOINT

上崩溃

在控制台上启用 Zombie tracking 后会显示以下消息:

[UIViewAnimationState release]: message sent to deallocated instance 0x14deff70

这里UIView加载会发生什么:

[super viewDidLoad];

NSURLRequest * urlRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.amazon.com"]];

self.webView.layer.cornerRadius = 0;
self.webView.userInteractionEnabled = YES;
self.webView.multipleTouchEnabled = YES;
self.webView.backgroundColor = [UIColor clearColor];
self.webView.scrollView.scrollEnabled = NO;
self.webView.scrollView.bounces = NO;
[self.webView loadRequest:urlRequest];

异常堆栈跟踪:

    Exception Type:  EXC_BREAKPOINT (SIGTRAP)
    Exception Codes: 0x0000000000000001, 0x000000000000defe
    Triggered by Thread:  2

    Thread 0 name:  Dispatch queue: com.apple.main-thread
    Thread 0:
    0   libsystem_kernel.dylib          0x2fe054f0 mach_msg_trap + 20
    1   libsystem_kernel.dylib          0x2fe052e4 mach_msg + 36
    2   CoreFoundation                  0x21fed936 __CFRunLoopServiceMachPort + 142
    3   CoreFoundation                  0x21febedc __CFRunLoopRun + 1012
    4   CoreFoundation                  0x21f3a20c CFRunLoopRunSpecific + 472
    5   CoreFoundation                  0x21f3a01e CFRunLoopRunInMode + 102
    6   GraphicsServices                0x293330a4 GSEventRunModal + 132
    7   UIKit                           0x255461cc UIApplicationMain + 1436
    8   WebViewCrash                    0x0002deec main (main.m:14)
    9   libdyld.dylib                   0x2fd52aac start + 0

    Thread 1 name:  Dispatch queue: com.apple.libdispatch-manager
    Thread 1:
    0   libsystem_kernel.dylib          0x2fe052a0 kevent64 + 24
    1   libdispatch.dylib               0x00162674 0x154000 + 58996
    2   libdispatch.dylib               0x00157496 0x154000 + 13462

    Thread 2 name:  WebThread
    Thread 2 Crashed:
    0   CoreFoundation                  0x2202aea2 ___forwarding___ + 534
    1   CoreFoundation                  0x21f5cdf4 _CF_forwarding_prep_0 + 20
    2   CoreFoundation                  0x21f2ee58 CFRelease + 596
    3   QuartzCore                      0x24f0ba60 CA::release_objects(X::List<void const*>*) + 12
    4   QuartzCore                      0x24f10dc2 -[CAAnimation dealloc] + 50
    5   libobjc.A.dylib                 0x2f7ecd5a objc_object::sidetable_release(bool) + 162
    6   libobjc.A.dylib                 0x2f7ed1a4 (anonymous namespace)::AutoreleasePoolPage::pop(void*) + 400
    7   CoreFoundation                  0x21fee2a4 __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 12
    8   CoreFoundation                  0x21fede1e __CFRunLoopDoTimer + 646
    9   CoreFoundation                  0x21fec06e __CFRunLoopRun + 1414
    10  CoreFoundation                  0x21f3a20c CFRunLoopRunSpecific + 472
    11  CoreFoundation                  0x21f3a01e CFRunLoopRunInMode + 102
    12  WebCore                         0x2d362ebe RunWebThread(void*) + 414
    13  libsystem_pthread.dylib         0x2fe95e90 _pthread_body + 136
    14  libsystem_pthread.dylib         0x2fe95e02 _pthread_start + 114
    15  libsystem_pthread.dylib         0x2fe93b8c thread_start + 4

任何建议表示赞赏 感谢

8 个答案:

答案 0 :(得分:7)

我在iOS 8上遇到同样的问题,更具体地说,iPad 3比其他人更容易失败。

根据您的帖子以及我能够找到的其他几个帖子,它似乎只是iOS8上UIWebView的问题,因为它适用于iOS7。

我所做的是在iOS8上使用新的WKWebView,这不会出现同样的问题,同时继续在iOS7上使用UIWebView

最好的办法是向Apple提交雷达并在此期间切换到WKWebView

答案 1 :(得分:6)

如果您不使用动画,则可以通过禁用动画来避免此错误。把它放在你的控制器init方法中:

[UIView setAnimationsEnabled:NO];

答案 2 :(得分:2)

[super viewDidLoad];

[[MPVolumeView alloc] init]; <------ add this line, that will be ok too.

NSURLRequest * urlRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.amazon.com"]];

self.webView.layer.cornerRadius = 0;
self.webView.userInteractionEnabled = YES;
self.webView.multipleTouchEnabled = YES;
self.webView.backgroundColor = [UIColor clearColor];
self.webView.scrollView.scrollEnabled = NO;
self.webView.scrollView.bounces = NO;
[self.webView loadRequest:urlRequest];

答案 3 :(得分:1)

这项工作似乎可以修复我的应用。我对此并不满意,但这是我唯一能够找到摆脱崩溃的唯一方法。

  

[self.webView performSelector:@selector(loadRequest :)   withObject:urlRequest] afterDelay:0.5];

或者,如果您想要更安全的东西,可以在iOS 8 +上使用WKWebView

由于WKWebView不支持本地文件,因此启动Web服务器:

[GCDWebServer setLogLevel:4];
webServer = [[[GCDWebServer alloc] init] retain];
[webServer addGETHandlerForBasePath:@"/" directoryPath:rootDir indexFilename:@"index.html" cacheAge:3600 allowRangeRequests:YES];
[webServer startWithPort:0 bonjourName:nil];

然后,根据操作系统版本,创建您的webview:

if (NSClassFromString(@"WKWebView"))
{
    NSString* jScript = @"";

    WKUserScript* wkUScript = [[WKUserScript alloc] initWithSource:jScript injectionTime:WKUserScriptInjectionTimeAtDocumentEnd forMainFrameOnly:YES];
    WKUserContentController* wkUController = [[WKUserContentController alloc] init];
    [wkUController addUserScript:wkUScript];

    WKWebViewConfiguration* wkWebConfig = [[WKWebViewConfiguration alloc] init];
    wkWebConfig.userContentController = wkUController;

    webViewNew = [[WKWebView alloc] initWithFrame:CGRectMake(0.f, 0.f, 1.f, 1.f) configuration:wkWebConfig];
    webViewNew.navigationDelegate = self;

    webViewNew.scrollView.bounces = NO;
    webViewNew.scrollView.scrollEnabled = NO;
    webViewNew.backgroundColor = [UIColor redColor];
    webViewNew.opaque = YES;
}
else
{
    webViewOld = [[UIWebView alloc] initWithFrame: CGRectMake (0, 0, 1.0f, 1.0f)];
    webViewOld.delegate = self;

    [[webViewOld scrollView] setBounces: NO];
    webViewOld.scrollView.scrollEnabled = NO;
    webViewOld.scalesPageToFit = YES;
    [webViewOld setBackgroundColor:[UIColor whiteColor]];
    [webViewOld setOpaque:NO];
}

然后浏览到:[NSString stringWithFormat:“htztp://127.0.0.1:%d”,(int)webServer.port] (忽略http中的z,stackoverflow不允许我将urls发布到localhost)

答案 4 :(得分:0)

我解决了这个问题。我有同样的问题添加视频标签(源是一个约18Mb的本地mp4文件)。我可以将视频标签识别为崩溃,因为没有视频的html不会崩溃。然后我试着通过javascript和应用程序崩溃两秒后注入视频标签。几个小时后,我发现了这个:UIWebView loading html5-Video EXC_BAD_ACCESS crash

我的解决方案是在javascript函数中提取视频标记注入,并在webViewDidFinishLoad上调用该函数。

所以,在我的控制器里我有:

- (void)webViewDidFinishLoad:(UIWebView *)webView
{
    [self.webView stringByEvaluatingJavaScriptFromString:@"placeVideoTag();"];
}

在我的index.html中,我有:

...
<div id="left">
    <div id="media-div"></div>
...

和(我也加了一个音频标签!):

<script>
    function placeVideoTag() {
        $('#media-div').html('<video id="videoController" width="100%" controls >   <source src="video_1.mp4" type="video/mp4"></video>');
        $('#media-div').append('<br/><audio id="audioController" controls="" width="100%"><source src="audio_1.mp3" type="audio/mp3"></audio>');
    }
</script>

我知道这听起来像一个奇怪的解决方案,但它确实有效。我有与此处所述相同的问题,也启用了僵尸跟踪

  

随机使用EXC_ARM_BREAKPOINT将应用程序崩溃在WebThread上

     

在控制台上启用Zombie跟踪后会显示以下消息:

     

[UIViewAnimationState release]:发送到解除分配的实例的消息   0x14deff70

答案 5 :(得分:0)

确保在dealloc方法

中将UIWebView委托设置为nil
- (void)dealloc {
  [self.webView stopLoading];
   self.webView.delegate = nil;
}

答案 6 :(得分:0)

尝试更新到iOS 8.4.1。它对我们有用(但是,我们在发行说明中没有找到任何对此错误的引用)。

答案 7 :(得分:-1)

我知道很晚但这可以帮助某人,确保你的IBOutlet观点很弱。 This answer帮助我摆脱了这个问题。