it-swarm.com.ru

Случайный сбой UIWebView в [выпуске UIViewAnimationState]: сообщение отправлено освобожденному экземпляру

У меня случайный сбой UIWebView с использованием iOS8.1 и UIWebView с использованием iPhone5. В моих тестах сбой не появлялся на iOS7.

Я создал этот репозиторий github для воспроизведения аварии: https://github.com/crarau/WebViewCrash

В основном я добавляю UIWebView и загружаю www.Amazon.com

Случайно приложение падает на WebThread с EXC_ARM_BREAKPOINT

После включения отслеживания зомби на консоли появляется следующее сообщение: 

[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

Любой совет приветствуется Спасибо

21
Ciprian Rarau

Я испытываю ту же проблему на iOS 8, а точнее iPad 3 выходит из строя гораздо чаще, чем другие.

Судя по вашему посту и нескольким другим, которые мне удалось найти, кажется, что это проблема с UIWebView только для iOS8, так как он работает на iOS7.

Что я сделал, так это использовал новую WKWebView на iOS8, которая не представляет такой же проблемы, продолжая использовать UIWebView на iOS7.

Лучше всего подать радар в Apple и переключиться на WKWebView.

7
Andrew

Если вы не используете анимацию, вы можете избежать этой ошибки, отключив анимацию. Поместите это в ваш метод init контроллера: 

[UIView setAnimationsEnabled:NO];
6
Cjolly
[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];
2
shuice

Похоже, что это обходной путь, чтобы исправить это для моего приложения. Мне это неудобно, но в настоящее время это единственное, что мне удалось выяснить, чтобы избавиться от аварии.

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

Или, если вы хотите что-то более безопасное, вы можете использовать WKWebView на iOS 8+

Поскольку WKWebView не поддерживает локальные файлы, запустите веб-сервер:

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

Затем, в зависимости от версии ОС, создайте свое веб-представление:

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] (Игнорируйте z в http, stackoverflow не позволит мне публиковать URL-адреса на localhost )

1
Roland Rabien

Я решил проблему. У меня была такая же проблема при добавлении тега видео (источником был локальный файл mp4 размером около 18 Мб). Я мог определить тег видео как ответственный за сбой, потому что HTML без видео не дает сбоя. Затем через две секунды я попытался вставить тег видео через javascript, и приложение упало. Через несколько часов я нашел это: UIWebView загружает 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>

Я знаю, это звучит как странное решение, но оно действительно работает. У меня была та же самая проблема, как указано здесь, также включающая отслеживание зомби

Случайно приложение падает в WebThread с EXC_ARM_BREAKPOINT

После включения отслеживания Zombie на консоли появляется следующее сообщение:

[UIViewAnimationState release]: сообщение отправлено освобожденному экземпляру 0x14deff70

0
Giorgio Andretti

убедитесь, что вы установили для делегата UIWebView значение nil в методе dealloc

- (void)dealloc {
  [self.webView stopLoading];
   self.webView.delegate = nil;
}
0
Tomer Even

Попробуйте обновить до iOS 8.4.1. Это сработало для нас (однако мы не нашли ссылок на эту ошибку в заметках о выпуске). 

0
abstractdog