我正在开发一个具有近12个视图控制器的应用程序。应用程序有tabBar和4个选项卡意味着四个视图控制器,并且有多个视图可在每个选项卡栏中导航。请注意每个选项卡都有一个navigationController,其rootviewController是它的第一个视图。应用程序是一个广泛的数据库应当我在模拟器上运行时它运行良好,但在设备上运行时获得didRecieve内存警告。关于这个问题我几乎没有问题。
注意:我已使用“仪器”工具检查了应用程序是否有泄漏,并且没有红色金字塔,这意味着代码中没有泄漏。
处理多个视图控制器时的最佳做法是什么。
当我收到内存警告时,我调用[self deleteObjects]删除所有正在为当前控制器重新调整值的实例。但我不相信这是否正确。当我们收到内存警告时应该怎么做。是否有任何好的教程。 (链接plz)
此外,如何确保不为可见控制器调用[self deleteObjcts]。 (之前我在viewDidUnload方法中调用了deleteObjects方法,但是因为我们做了[super didRecieveMemoryWarning],所以它会破坏代码,因为viewDidLoad是从上到下在层次结构中调用的,所以一旦我删除顶层viewController的对象,显然会有其他的错误控制器。)
对我来说,一些基本令人困惑的问题如下:
为什么内存警告不一致。就像我有时在开始时得到它们,而有时候没有警告。
当我们使用[NSDate date],[UIImage imageNamed:@“...”],[NSString stringWithFormat]等时,我们不拥有这些对象,我们不必释放它们,但我们怎样才能确定当我们收到记忆警告时,这些物体会被重新发送。
我在多个地方使用NSMutableArray。在这个数组中我存储了[NSString StringWithFormat],[UIImage imageNamed ...]对象,所以当我重新发布数组时,我需要重新定位数组中的对象,虽然我不拥有它们。
虽然这是一个很重要的问题清单,但我感谢你的帮助和时间,因为我处于发展的最后阶段,我正面临着这些重大挑战。
答案 0 :(得分:1)
将对象放入数组时,将保留该对象。当您释放数组时,它将发送所有它的子对象。当您在阵列中存储自动释放的对象时,它们将负责释放它们。释放数组时可能已经发生这种情况,因此将立即在所有对象上调用-dealloc
。
NSMutableArray *someArray = [[NSMutableArray alloc] init]; NSDate *date = [NSDate date]; // Autoreleased object. Retain-count is 1 [someArray addObject:data]; // The array retains the data object. Now has a retain-count of 2 // Some other things // The date object has been called release at some time (because it was autoreleased) // so date now has a retain-count of 1 [someArray release] // Will release all containing objects thus date will be called dealloc
答案 1 :(得分:1)
我遇到了UIImage imageNamed的内存问题,我认为这是由操作系统缓存图像造成的,而不应该在应用时释放它们。还有很多其他开发人员看过同样的事情。
我会尝试使用imageWithContentsOfFile而不是imageNamed,看看会发生什么。
例如forPNG images -
[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"filename here" ofType:@"png"]];