在我的应用程序中,如果我有一个视图已被释放(通过模态解除或导航堆栈弹出),然后我得到一个内存警告后,我的应用程序崩溃。didreceivememorywarnings发送到释放实例的消息
我通过把一个模式创建/在我的应用程序看起来像这样的解雇很早就进行了测试:
WWebViewController *webViewController = [[WWebViewController alloc] initWithPath:@"http://www.google.com"];
[webViewController setIsModal:YES];
WMainNavController *navController = [[WMainNavController alloc] initWithRootViewController:webViewController];
[self presentViewController:navController animated:YES completion:nil];
Web视图很简单:
- (void)viewDidLoad
{
[super viewDidLoad];
[self setNavigationDefaultsWithTitle:@"Loading..." withBackButton:YES withSearchButton:YES deepLinked:false];
webView = [[UIWebView alloc] initWithFrame:[self.view bounds]];
webView.delegate = self;
[self.view addSubview:webView];
[webView scalesPageToFit];
[webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:self.path]]];
[self showNoConnectionImageIfNecessary:NO];
// Do any additional setup after loading the view.
}
...
- (void)dealloc {
[webView loadHTMLString:@"" baseURL:nil];
[webView stopLoading];
[[NSURLCache sharedURLCache] removeAllCachedResponses];
[webView setDelegate:nil];
webView = nil;
}
但是,简单地呈现然后解散这个视图,然后模拟一个内存警告给出了这个:
*** -[WMainNavController retain]: message sent to deallocated instance 0xba953c0
我已经通过调用WWebViewController的情况下直接WMainNavController,通过使用常规的导航控制器尝试,试图简单地推动东西一个导航堆栈尝试这样做。如果我在应用程序的任何地方弹出或取消了视图,它总是崩溃。
我在做一些根本性的错误吗?如果我通过应用程序进行浏览而不会解除/弹出,它会处理内存警告,并且在此之前只有一个屏幕将此屏幕呈现为模式,并且是该程序的根视图。
我会提供任何需要的额外信息,有没有人看过类似的东西?
编辑 - 这是一个ARC实现。
编辑 - 这是我的乐器与僵尸的截图:
在我看来是一切正常。它可以在解雇时正确解除分配,但由于某种原因,内存警告呼叫试图访问该视图控制器。我处于全面亏损状态。
对不起,是的,这是ARC。我将编辑它。 – Stakenborg
如果您在'dealloc'中取出所有额外的'webView'调用,你会看到这个问题吗?通常,您不应在释放中间启动新的异步加载(如loadHTMLString:baseURL:)。 –
dealloc方法中的大部分内容都是我正在处理解除分配webView时的内存问题的东西。愚蠢的东西总是试图挂在记忆中。但是,无论我忽视/弹出什么视图,都会发生这种崩溃,它不一定是这个特定的Web视图(或Web视图全部,可以是任何视图控制器)。要直接回答你的问题,是的,如果我在dealloc方法中删除所有这些东西,它仍然会发生。 – Stakenborg