2013-08-27 15 views
1

在我的应用程序中,如果我有一个视图已被释放(通过模态解除或导航堆栈弹出),然后我得到一个内存警告后,我的应用程序崩溃。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实现。

编辑 - 这是我的乐器与僵尸的截图:

enter image description here

在我看来是一切正常。它可以在解雇时正确解除分配,但由于某种原因,内存警告呼叫试图访问该视图控制器。我处于全面亏损状态。

+0

对不起,是的,这是ARC。我将编辑它。 – Stakenborg

+0

如果您在'dealloc'中取出所有额外的'webView'调用,你会看到这个问题吗?通常,您不应在释放中间启动新的异步加载(如loadHTMLString:baseURL:)。 –

+0

dealloc方法中的大部分内容都是我正在处理解除分配webView时的内存问题的东西。愚蠢的东西总是试图挂在记忆中。但是,无论我忽视/弹出什么视图,都会发生这种崩溃,它不一定是这个特定的Web视图(或Web视图全部,可以是任何视图控制器)。要直接回答你的问题,是的,如果我在dealloc方法中删除所有这些东西,它仍然会发生。 – Stakenborg

回答

0

对于任何遇到类似问题的人,我无法真正解释如何解决问题,但我可以告诉你我的问题是如何让我的问题神奇消失。

我基本上从我的目标的构建阶段开始删除任何类别/控制器/任何影响我的应用程序的许多或所有其他主要组件的内容。然后,我相应地注释了代码,所以我的应用程序将构建到我需要它去测试的位置。最终,我隔离了一个UIViewController类别,它导致了问题,并从中删除了所有的方法以及NSString的extern变量。

这解决了这个问题,但是当我试图弄清楚是什么方法导致它时......结果都没有。当我没有评论所有事情,并回到我开始使用该类别的地方时,它不再崩溃。

我很高兴它现在有效,但该死的让我感到困惑,我永远不会真正知道它为什么打破了第一位。

相关问题