好的我有一个可怕的EXC_BAD_ACCESS我似乎无法追踪但它只发生在我第二次加载的UIWebView上。我搜索并审查了所有关于SO的类似问题并尝试了一些不同的方法,但我仍然在苦苦挣扎。
这是最终加载WebView的程序流程。
我有一个列出视频的表视图。 单击行时,将加载详细信息视图,其中包含更多信息。关于视频。 加载详细信息视图后,如果用户单击“播放”,则会加载具有WebView的其他视图。
在此视图中,在viewDidLoad上创建NSURLRequest并将其传递给WebView loadRequest。
WebView加载正常并显示包含我需要的视频的网页。所有这些都在导航控制器上,因此用户可以单击“返回”并返回上一个详细信息视图。
我在dealloc中发布了WebView,并且如果仍在执行此操作,也会阻止它加载。 WebView是通过IBOutlet获得的,并合成为(非原子,保留)。
我有NSZombiesEnabled并且没有看到任何问题。它什么时候崩溃?如果用户再次单击“播放”,则会再次创建视频视图,并在[webView loadRequest]上创建 - 一旦页面加载,我就会获得EXC_BAD_ACCESS。
下面是踢球者,如果我回到桌面并选择另一行(视频),那么我可以毫无问题地加载该WebView。只有当我加载两次相同的视频才会崩溃。
保存WebView的视图在创建并在nav上推送后被释放。控制器。我设置了大量的断点 - 在调用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];
}
答案 0 :(得分:3)
编辑 - 如果您不想阅读所有评论,请参阅以下内容:
内容来自你管 - 使用不同的网址删除了崩溃:(
您好,
1)所有[self retain]
和[self release]
来电都有什么用?你不应该需要它们 - 如果你这样做,你就会在代码中的其他地方掩盖一个bug。
2)这看起来不对 -
[webView stopLoading];
if ([webView isLoading])
[webView stopLoading];
如果你必须把它放在其他地方有一个bug - 如果调用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)
我刚刚意识到这听起来非常关键 - 它并不意味着,我们在调试内存问题时都尝试过这些东西!