didreceivememorywarnings消息发送到解除分配的实例

时间:2013-08-27 20:37:48

标签: ios memory-management didreceivememorywarning

在我的应用程序中,如果我有一个已被解除分配的视图(通过模式解除或导航堆栈弹出),之后我收到内存警告,我的应用程序崩溃。

我已经通过在我的应用程序中尽早设置模态创建/解除来测试,看起来像这样:

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];

网页视图非常简单:

- (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

在我看来,一切都很正常。它在解雇时正确解除分配,但由于某种原因,内存警告调用正试图访问该视图控制器。我完全失去了。

1 个答案:

答案 0 :(得分:0)

对于遇到类似问题的人,我无法解释如何修复它,但我可以告诉你我做了什么让我的问题神奇地消失。

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

这解决了这个问题,但当我试图找出导致它的方法时......结果却没有。当我取消注释所有内容并回到我开始使用该类别时,它继续工作,不再发生崩溃。

我很高兴它现在有效,但该死的神秘,我永远不会真正知道它为什么会破坏它。