1

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

我已经通过在我的应用程序中尽早放置模态创建/关闭进行测试,如下所示:

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

我已经通过不使用 WMainNavController 直接调用 WWebViewController 进行了尝试,通过使用常规导航控制器进行了尝试,尝试简单地将某些内容推送到导航堆栈。如果我在应用程序的任何位置弹出或关闭视图,它总是会崩溃。

我在做一些根本错误的事情吗?如果我在不关闭/弹出的情况下通过应用程序进行处理,它可以很好地处理内存警告,并且在此之前只有一个屏幕将此屏幕显示为模式并且是程序的根视图。

我会提供任何需要的额外信息,有人见过这样的吗?

编辑——这是一个 ARC 实现。

编辑——这是我的带有僵尸的乐器的截图:

在此处输入图像描述

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

4

1 回答 1

0

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

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

这解决了问题,但是当我试图弄清楚是什么方法导致它时......结果没有一个。当我取消注释所有内容并回到我开始的类别时,它继续工作,不再崩溃。

我很高兴它现在可以工作,但我永远不会真正知道它为什么一开始就坏了,这让我很困惑。

于 2013-08-28T19:52:38.633 回答