我有一个 iOS 应用程序,它使用 UINavigationController 以相当简单的主/细节方式向前(推送)和向后(弹出)移动。
详细视图控制器有 2 或 3 个全屏图像,我使用手动添加
layer1 = [[UIImageView alloc] initWithFrame:layer1Rect];//layer1rect is a CGRect
UIImage *img1 = [[UIImage alloc]initWithContentsOfFile:imgName];//imgName is an image in the bundle
layer1.image = img1;
layer1.alpha = 1;
[self.view addSubview:layer1];
img1 = nil;
在我看来DidUnload 我有
for (UIView *subview in [self.view subviews]) {
[subview removeFromSuperview];
}
layer1 = nil;
layer2 = nil;
layer3 = nil;
我遇到的问题是,在推送和弹出十几次之后,我收到了内存警告和崩溃。
我正在使用 ARC,尽管从我在其他地方读到的内容来看,这本身不太可能是问题的根源。
当我在仪器中(在设备上,而不是模拟器上)运行应用程序时,我看到了一些有趣的结果。
首先,内存分配工具显示不到 2MB 的内存使用量并且没有泄漏,直到出现警告和崩溃。我还可以看到,当我执行 pop 时,我的详细视图控制器实例被释放。
但是,如果我查看活动监视器,我发现使用量从大约 50MB 开始,并且每次我推送到详细视图控制器时都会继续增加,直到它在大约 250MB 时崩溃。
我认为也许图像正在被缓存,但我没有在任何地方使用 imageName:,这是缓存的常见原因。
那么我错过了什么?如何确保当我将详细视图控制器从堆栈中弹出时,它正在使用的所有内存都再次可用?