在iPhone上需要有关didRecieveMemoryWarning的帮助

时间:2009-09-27 20:31:09

标签: iphone

我正在开发一个具有近12个视图控制器的应用程序。应用程序有tabBar和4个选项卡意味着四个视图控制器,并且有多个视图可在每个选项卡栏中导航。请注意每个选项卡都有一个navigationController,其rootviewController是它的第一个视图。应用程序是一个广泛的数据库应当我在模拟器上运行时它运行良好,但在设备上运行时获得didRecieve内存警告。关于这个问题我几乎没有问题。

注意:我已使用“仪器”工具检查了应用程序是否有泄漏,并且没有红色金字塔,这意味着代码中没有泄漏。

  1. 处理多个视图控制器时的最佳做法是什么。

  2. 当我收到内存警告时,我调用[self deleteObjects]删除所有正在为当前控制器重新调整值的实例。但我不相信这是否正确。当我们收到内存警告时应该怎么做。是否有任何好的教程。 (链接plz)

  3. 此外,如何确保不为可见控制器调用[self deleteObjcts]。 (之前我在viewDidUnload方法中调用了deleteObjects方法,但是因为我们做了[super didRecieveMemoryWarning],所以它会破坏代码,因为viewDidLoad是从上到下在层次结构中调用的,所以一旦我删除顶层viewController的对象,显然会有其他的错误控制器。)

  4. 对我来说,一些基本令人困惑的问题如下:

    1. 为什么内存警告不一致。就像我有时在开始时得到它们,而有时候没有警告。

    2. 当我们使用[NSDate date],[UIImage imageNamed:@“...”],[NSString stringWithFormat]等时,我们不拥有这些对象,我们不必释放它们,但我们怎样才能确定当我们收到记忆警告时,这些物体会被重新发送。

    3. 我在多个地方使用NSMutableArray。在这个数组中我存储了[NSString StringWithFormat],[UIImage imageNamed ...]对象,所以当我重新发布数组时,我需要重新定位数组中的对象,虽然我不拥有它们。

    4. 虽然这是一个很重要的问题清单,但我感谢你的帮助和时间,因为我处于发展的最后阶段,我正面临着这些重大挑战。

2 个答案:

答案 0 :(得分:1)

  1. 内存不足时会收到内存警告。内存不仅由您的应用程序占用,所有其他正在运行的进程都使用内存,并且使用的内存可能总是不同。
  2. 这些对象都是自动释放的。 NSAutoreleasePool将负责释放对象,你不应该自己释放这样的对象(好吧,只要你没有自己保留它)。这并不重要,自动释放的对象将很快发布。
  3. 将对象放入数组时,将保留该对象。当您释放数组时,它将发送所有它的子对象。当您在阵列中存储自动释放的对象时,它们将负责释放它们。释放数组时可能已经发生这种情况,因此将立即在所有对象上调用-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"]];

这是thread that covers what I'm talking about