Случайный сбой 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
Приветствуются любые советы
Благодаря
Ответы
Ответ 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. Это сработало для нас (однако мы не нашли ссылок на эту ошибку в примечаниях к выпуску).
Ответ 8
Я знаю, что поздно, но это может помочь кому-то, убедитесь, что ваши представления IBOutlet слабы. Этот ответ помог мне избавиться от этой проблемы.