【问题标题】:Where to release all my views if i received memory warnings?如果我收到内存警告,在哪里发布我的所有视图?
【发布时间】:2011-09-08 06:11:11
【问题描述】:

如果我收到内存警告,我必须在哪里释放我的所有视图和数据?

我是否必须在

中发布

- (void)didReceiveMemoryWarning 或在

- (void)viewDidUnload

【问题讨论】:

  • -(void)viewDidUnload :) - 因为当操作系统开始发出内存警告时,它会尝试删除当前未使用的视图。在卸载视图 viewDidUnload 方法调用时。所有视图属性都应设置为零。

标签: iphone memory-management memory-leaks viewdidunload


【解决方案1】:

对于 iPhone OS 3.0 及更高版本,viewDidUnload 可能会在内存不足的情况下被调用,因此最好在 viewDidUnload 中释放视图,请注意,对于自定义视图,请在 viewDidLoad 而不是类的 init 方法中创建它们。

didReceiveMemoryWarning更多地用于发布自定义数据结构而不是发布视图。

【讨论】:

  • 好吧,你的意思是说所有分配的 UIButtons、UILabel、控制器对象等都应该在 viewDinUnload 中释放?并且所有数据都应该只在 didReceiveMemoryWarning 中发布?对
  • 是的,就是这样。 (但我忍不住要说:release也在dealloc中!虽然已经给出了)。通常你会释放显着消耗内存的数据;例如位图存储在内存中。对于小型数据,例如小型 NSArray,我认为除非它们数量庞大,否则它是没有意义的。
  • 好的,谢谢,还有一件事我不应该在 viewDidUnload 和 memoryWarnin 中写下相同的数据或相同的对象?然后它将尝试释放两次,应用程序将崩溃。是吗?
  • 这并不总是发生,但它是可能的。这就是为什么最好使用 self.myVariable = nil;而不是释放它以避免双重释放;当然,假设您使用的是@property(nonatomic, retain)。
【解决方案2】:
- (void)didReceiveMemoryWarning

这应该仅用于您不再需要且不再需要的东西,因此将严格不需要的内容放在这里,例如,如果您不再使用视图并且可能没有发布,您可以在此处发布它,所以当内存警告来了就会被释放。

- (void)viewDidUnload

在此确保视图将被释放,以防它们被视图控制器额外引用。你可以参考这个问题:When to use viewDidUnload

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-26
    • 1970-01-01
    相关资源
    最近更新 更多