在我的应用程序中,如果我有一个已被解除分配的视图(通过模式解除或导航堆栈弹出),之后我收到内存警告,我的应用程序崩溃。
我已经通过在我的应用程序中尽早设置模态创建/解除来测试,看起来像这样:
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实现。
编辑 - 这是我的僵尸乐器的屏幕截图:
在我看来,一切都很正常。它在解雇时正确解除分配,但由于某种原因,内存警告调用正试图访问该视图控制器。我完全失去了。
答案 0 :(得分:0)
对于遇到类似问题的人,我无法解释如何修复它,但我可以告诉你我做了什么让我的问题神奇地消失。
我基本上开始从目标构建阶段的编译源中删除任何类别/控制器/任何影响我的应用程序的许多或所有其他主要组件的内容。然后我相应地注释掉了代码,所以我的应用程序将构建到我需要它去测试的地方。最后,我隔离了一个“导致问题”的UIViewController类,并从中删除了所有方法以及NSString extern变量。
这解决了这个问题,但当我试图找出导致它的方法时......结果却没有。当我取消注释所有内容并回到我开始使用该类别时,它继续工作,不再发生崩溃。
我很高兴它现在有效,但该死的神秘,我永远不会真正知道它为什么会破坏它。