fra*_*yer 31 iphone cocoa-touch uiwebview
我有一个包含UIWebView的视图,它正在加载一个谷歌地图(所以很多javascript等).我遇到的问题是,如果用户在Web视图加载完之前点击导航栏上的"后退"按钮,我不清楚如何整理地告诉Web视图停止加载然后释放它,而不是获取发送到解除分配的实例的消息.我也不确定网页视图是否喜欢它的容器视图在它完成之前消失(但是如果用户在加载之前点击后退按钮,我别无选择).
在我的viewWillDisappear处理程序中我有这个
map.delegate=nil;
[self.map stopLoading];
Run Code Online (Sandbox Code Playgroud)
这似乎可以处理大多数情况,因为nil'ing委托停止它将didFailLoadWithError发送到我的视图控制器.但是,如果我在视图的dealloc方法中释放Web视图,有时(间歇性地)我仍会收到发送到解除分配的实例的消息,这似乎与在实际页面中运行的javascript有关,例如:
-[UIWebView webView:runJavaScriptAlertPanelWithMessage:initiatedByFrame:]: message sent to deallocated instance 0x4469ee0
Run Code Online (Sandbox Code Playgroud)
如果我只是不发布webview,那么我不会收到这些消息,但我想我正在泄漏webview.
如果我没有发送'stopLoading'消息,只是在viewWillDisappear中发布webview,那么我会看到如下消息:
/SourceCache/WebCore/WebCore-351.9.42/wak/WKWindow.c:250 WKWindowIsSuspendedWindow: NULL window.
Run Code Online (Sandbox Code Playgroud)
可能相关,我有时(再次完全断断续续)得到一个丑陋的heisenbug,点击其他视图的导航栏上的后退按钮将弹出标题,但不是视图.换句话说,我在堆栈上留下了视图n的标题,但是显示的视图仍然是视图n + 1(结果是你被困在这个屏幕上并且无法返回到根视图 - 你可以去其他方向,即推送更多视图并弹回到没有正确弹出的视图,只是不到根视图.唯一的出路是退出应用程序).在其他时候,相同视图上的推送和弹出的相同序列工作正常.
这个特别的一个让我疯了.我认为它可能与视图在加载Web视图之前消失有关,即在这种情况下我怀疑它可能会在内存上乱写并混淆视图堆栈.或者,这可能是完全不相关的,而且是其他地方的错误(我从来没有能够在调试构建模式下重现它,只有当我无法使用gdb观看它时才会发布版本设置:-).从我的调试运行开始,我认为我不会过度发布任何内容.而且我似乎只能触发它,如果在某些时候我已经点击了具有Web视图的视图,并且在此之后不会立即发生.
rpe*_*ich 53
对此的变化应该解决泄漏和僵尸问题:
- (void)loadRequest:(NSURLRequest *)request
{
[self retain];
if ([webView isLoading])
[webView stopLoading];
[webView loadRequest:request];
[self release];
}
- (void)webViewDidStartLoad:(UIWebView *)webView
{
[self retain];
}
- (void)webViewDidFinishLoad:(UIWebView *)webView
{
[self release];
}
- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error
{
[self release];
}
- (void)viewWillDisappear
{
if ([webView isLoading])
[webView stopLoading];
}
- (void)dealloc
{
[webView setDelegate:nil];
[webView release];
[super dealloc];
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
19849 次 |
最近记录: |