【问题标题】:UIWebView crashing only on second loadUIWebView 仅在第二次加载时崩溃
【发布时间】:2026-02-13 12:40:02
【问题描述】:

好的,我有一个可怕的 EXC_BAD_ACCESS,我似乎无法找到它,但它只发生在我第二次加载 UIWebView 时。我已经搜索并查看了关于 SO 的所有类似问题,并尝试了几种不同的方法,但我仍在苦苦挣扎。

这是最终加载 WebView 的程序流程。

我有一个列出视频的表格视图。 单击一行时,将加载详细信息视图,其中包含更多信息。关于视频。 加载详细视图后,如果用户单击“播放”,则会加载具有 WebView 的另一个视图。

在这个视图中,在 viewDidLoad 上,NSURLRequest 被创建并传递给 WebView loadRequest。

WebView 可以正常加载并显示包含我需要的视频的网页。所有这些都在导航控制器上,因此用户可以单击“返回”并返回到上一个详细视图。

我正在释放 dealloc 中的 WebView,如果它仍在这样做,也会停止加载它。 WebView 是通过 IBOutlet 获得的,并被合成为 (nonatomic,retain)。

我有 NSZombiesEnabled 并没有发现任何问题。那么它什么时候崩溃呢?如果用户再次单击“播放”,则会再次创建视频视图并在 [webView loadRequest] 上 - 一旦页面加载,我会得到一个 EXC_BAD_ACCESS。

不过,这里是关键,如果我回到表格并选择另一行(视频),那么我可以毫无问题地加载该 WebView。只有当我加载相同的视频两次时它才会崩溃。

保存 WebView 的视图在创建并推送到导航后被释放。控制器。我设置了大量的断点 - 在调用 webViewDidFinishLoad 之前,一切(在第二次加载时)都很好,之后发生的任何事情都会导致崩溃。我没有得到堆栈跟踪(或者不知道如何找到它):)

谢谢!

这是来自 WebView 视图的代码 - 其中一些是基于其他人对 UIWebView 内存问题的发现。

 - (void)viewDidLoad {

[super viewDidLoad];
self.title = @"Video Player";

NSURL *url = [NSURL URLWithString:video.url];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
[webView loadRequest:request];  

}


- (void)viewDidUnload {
[super viewDidUnload];
[webView setDelegate:nil];
[self setWebView:nil];
}


- (void)dealloc {
[video release];
[super dealloc];
}

【问题讨论】:

  • 提供一些代码,这可能是由于内存问题,如果我们没有看到代码,我们无能为力。
  • 添加了视图中的代码 - 请注意,如果我不调用 loadRequest - 我可以根据需要多次加载此视图而不会出现任何问题。我的 webView 一定有什么问题。

标签: iphone uiwebview exc-bad-access


【解决方案1】:

编辑 - 如果你不想阅读所有的 cmets,这就是发生了什么:

内容来自您的试管 - 使用不同的 URL 消除了崩溃:(


嗨,

1) 所有[self retain][self release] 调用是怎么回事?你不应该需要它们中的任何一个 - 如果你这样做了,那么你就是在代码中的其他地方掩盖了一个错误。

2) 这看起来不对 -

[webView stopLoading];
if ([webView isLoading])
    [webView stopLoading];

如果你必须把它放在其他地方,那就是一个错误 - 如果调用 stopLoading 不起作用,那么再次调用它也无济于事!

3) 您的整个 loadRequest 方法可以只是 [webView loadRequest:request]; - 您可以相当安全地假设,如果您告诉 webview 加载某些内容,它将停止加载其他任何内容。

4) 我把 [super viewDidLoad]; 放在了 viewDidLoad 函数的开头而不是结尾——你不知道它还设置了哪些你可能需要的东西(尽管它也可能什么都不做——我只是试着玩一下安全的) 5) .h 文件中 webView 的属性声明是什么(应该保留)(假设它是从 xib 文件创建为 IBOutlet)

6) 在您的 viewDidUnload 中,您需要删除您的 webview - 将它的委托设置为 nil 并调用 [self setWebView:nil]; 否则您可能会泄漏它。 (假设它是从 xib 文件创建为 IBOutlet)

我刚刚意识到这听起来很关键 - 这不是故意的,我们在调试内存问题时都尝试过这些事情!

【讨论】:

  • 谢谢,将尝试移动 [super viewDidLoad] - 所有保留/释放等和 stopLoading 都被添加为测试,因为我无法追踪它。你是对的,它不应该是必要的——其他一些 SO 帖子已经取得了一些成功。
  • 我更新了代码 - 请参见上文。我做了这些改变,也清理了不应该存在的东西。我仍然得到相同的结果。
  • 虽然你应该注意到我实际上并没有直接回答你的问题,因为我不是 100% 确定它为什么会崩溃 :) 我的建议应该只是帮助你获得更像我的教程的代码看过/我写的代码有效。如果它仍然抛出错误,那么发布更新的代码,我们再看看。祝你好运!
  • 嗯,看起来不错 :( 每次用户单击不同的表格视图单元格时,您是否创建了一个新的 ViewController?
  • 是的,一个视图控制器(Detailed View)被创建、推送和释放。奇怪的部分 - 如果我不调用 loadRequest 视图本身加载/卸载就好了,我想要多少次。即使在第二次(崩溃)加载时,Web 视图也会显示页面,然后才会崩溃。