Подтвердить что ты не робот

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

У меня случайная авария 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];

Исключение stacktrace:

    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

Приветствуются любые советы Благодаря

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

[UIView setAnimationsEnabled:NO];

Ответ 3

[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];

Ответ 4

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

[self.webView performSelector: @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)

Ответ 5

Я решил проблему. У меня была такая же проблема с добавлением тега видео (источником был локальный файл mp4 около 18 МБ). Я мог бы идентифицировать тег видео как авария, потому что html без видео не сбой. Затем я попытался ввести через две секунды видеотег через javascript и приложение разбилось. Через несколько часов я нашел это: UIWebView, загружающий html5-Video EXC_BAD_ACCESS сбой.

Мое решение состояло в том, чтобы извлечь инъекцию тега видео в функцию 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>

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

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

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

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

Ответ 6

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

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

Ответ 7

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