gpt4 book ai didi

ios - 关于内存警告的问题

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:45:54 25 4
gpt4 key购买 nike

我的 iOS 应用程序存在内存问题,对此我有几个问题。

首先,我正在使用 iOS 6 和 ARC。

现在让我解释一下我的情况:

我有两个观点。从第一个 View 开始,如果我点击一个按钮,我将创建第二个 View (使用 allocinit)并使用以下代码将其显示为模态:

[self presentViewController:secondView animated:YES completion:^{
[secondView prepareToDraw]; // Function I use to start my computations and rendering
}];

有时,当计算完成后,我想关闭我的第二个 View 并返回到第一个 View 。我在第二个 View 中使用此代码:

[self dismissViewControllerAnimated:YES completion:^{
[self finished]; // Function I use to free some malloc
}];

我使用 Instruments Allocations 和 Leaks 运行我的应用程序,我没有泄漏。

这是我的didReceiveMemoryWarning 的代码:

- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];

if ([self isViewLoaded] && ([[self view] window] == nil)) {
self.view = nil;

[self tearDownGL];

if ([EAGLContext currentContext] == self.context) {
[EAGLContext setCurrentContext:nil];
}
self.context = nil;
}

// Dispose of any resources that can be recreated.
NSLog(@"Resources freed");
}

tearDownGL 函数释放 OpenGLES 资源,如纹理、顶点数组......

当我运行我的应用程序时,在第一个 View 和第二个 View 之间切换几次后,我收到内存警告,然后我的应用程序崩溃了。

这是我的问题:

1- 应用程序是否会自动释放我的 UIImage、UIView、...我的 Controller ?如果没有,我如何在使用 ARC 时释放它们?我还看到了 viewDidUnload 函数,但它已被弃用,如文档所述:

Called when the controller’s view is released from memory. (Deprecated in iOS 6.0. Views are no longer purged under low-memory conditions and so this method is never called.)

但是如果 View 在内存不足的情况下不再被清除,我该如何释放更多内存以防止我的应用程序崩溃?我该怎么办?

2- 我在我的 2 个 Controller 的 didReceiveMemoryWarning 函数上放置了一个断点。当我在模拟器上运行应用程序时,我模拟了一个内存警告。我可以看到我的 2 个 Controller 调用了一次 didReceiveMemoryWarning。但是,如果我在第一个和第二个 Controller 之间切换多次,则 didReceiveMemoryWarning 会为我的第一个 View Controller 调用一次,但会为我的第二个 View Controller 调用多次。如果我切换 3 次,该函数将被调用 3 次。所以我想,当我“关闭”我的第二个 View 以返回到第一个 View 时,第二个 View 没有被释放并且仍然存在。为什么 ?我怎样才能强制它被摧毁? (因为我不会再使用它并创建一个新的)我在一个函数中创建了第二个 View Controller ,但我没有保留对它的任何引用(它不存储在类中)。

最佳答案

您应该释放(在 ARC 中,这意味着将所有强引用设置为 nil)所有内存(图像、NSData 对象、数组、模型层表示的所有数据等)当前不需要并且可以(easiyl)重新- 再次使用时创建。如果这些对象可以在内存警告期间被释放然后将被重新创建,则所有其他代码都应该以检查属性/iVars 是否为 nil 的方式编写。

我怀疑 self.view 是可能被处置的对象之一。

您可能已经显示了一个 UIImageView。这可能是用 UIImage 对象创建的。当显示 UIImageView 时,您并不是真的不需要内存中的 UIImage。 (如果 UIImageView 仍然需要它,那么它会保留它或在其 onw 上保留一个强引用,这样您就不必担心保留图像本身。)这是要释放的资源。

如果 self.context 在处理资源中,我不能说。很可能是。

关于ios - 关于内存警告的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18631321/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com