0

我有ios应用程序。一些视图控制器包含 webviews。一切都很好,除了一个问题

当应用程序启动并且我有几分钟不使用它然后继续我的工作时,它可以正常工作,但是当我想用 webview 加载 viewcontroller 时,它会因SIGKILL错误而崩溃。休息一段时间后,其他视图控制器没有问题。这是我用于 webviews 的代码:

_webView = [[UIWebView alloc] initWithFrame:self.view.bounds)];
[self.view addSubview:_webView];
_webView.userInteractionEnabled = NO;
[_webView release];
// here is the local page, the same happens if i load internet page..
NSString *path = [[NSBundle mainBundle] pathForResource:@"localpage" ofType:@"html"];
_url = [NSURL fileURLWithPath:path];
[_webView loadRequest:[NSURLRequest requestWithURL:_url]];

所以问题是为什么应用程序崩溃只是在一些中断后尝试加载带有 webviews 的视图控制器?

谢谢。

4

1 回答 1

3

您的代码非常危险:

_webView = [[UIWebView alloc] initWithFrame:self.view.bounds)];
[self.view addSubview:_webView];
_webView.userInteractionEnabled = NO;
[_webView release];

我认为这_webView是一个伊瓦尔。首先,不要直接访问您的 ivars,除非在 init 和 dealloc 中。直接 ivar 访问是导致崩溃的第一大原因。做错事太容易了,而你在这里做错了。你在完成之前释放了你的 ivar。你赌的是为你持有它的观点,这可能会发生也可能不会发生。例如,如果视图被卸载(当你离开屏幕时可能发生),那么_webView它就变成了一个悬空指针。这里正确的代码是(假设webView是一个retain属性):

self.webView = [[[UIWebView alloc] initWithFrame:self.view.bounds)] autorelease];
[self.view addSubview:self.webView];
self.webView.userInteractionEnabled = NO;

您也保留不足_url,如果您_url在此代码之外访问,可能会导致崩溃。同样,切换到访问器将解决这个问题。

self.url = [NSURL fileURLWithPath:path];
[self.webView loadRequest:[NSURLRequest requestWithURL:self.url]];

请注意,如果您切换到 ARC,则此问题和许多其他问题很容易消失。除了更容易编写且崩溃更少之外,ARC 代码几乎总是比等效的正确编写的手动内存管理更快。除非您必须支持 iPhoneOS 3,否则您绝对应该切换到 ARC。

于 2012-07-21T18:34:16.103 回答