在iOS中,使用ARC,是否足以将所有ivars和属性设置为nil,并在viewDidUnload中释放上下文,图像,颜色空间?

nop*_*ole 6 iphone objective-c ios automatic-ref-counting

对于iOS应用程序,使用ARC,我们通常会发布这些viewDidUnload吗?

  1. 将所有实例变量设置为 nil

  2. 将所有属性设置为 nil

  3. 使用CGContextRelease,CGImage with CGImageRelease和color space 释放任何上下文CGColorSpaceRelease(释放任何非对象)

  4. 需要没有特别关注NSMutableArrayNSSet要素:刚才设置的参考NSMutableArray中和的NSSet为零,每个元素会自动释放.

这样做会处理ARC下的大部分内存释放吗?是否还需要发布其他项目?

Ste*_*her 14

很多人误解了这一点viewDidUnload.特别是,它不是对应的viewDidLoad.在大多数情况下,视图控制器将被取消分配而不会viewDidUnload被调用.出于这个原因,你永远不应该考虑在viewDidUnload适当的平衡中进行重新分配viewDidLoad.

viewDidUnload已被苹果公司弃用.可能反对使用它的最好的论据是它的标题(我已经包装):

- (void)viewDidUnload NS_DEPRECATED_IOS(3_0,6_0); // Called after the view
    // controller's view is released and set to nil. For example, a memory warning
    // which causes the view to be purged. Not invoked as a result of -dealloc.`
Run Code Online (Sandbox Code Playgroud)

那是什么viewDidUnload?它背后的想法是视图从视图控制器后面卸载.这使您有机会分离任何指针并清除您可以轻松重建的任何信息.您的视图可能会重新加载,此时您需要重建任何缓存.Apple描述了这个:

当发生内存不足的情况并且不需要当前视图控制器的视图时,系统可以选择从内存中删除这些视图.在视图控制器的视图发布后调用此方法,并且您有机会执行任何最终清理.如果视图控制器存储对视图或其子视图的单独引用,则应使用此方法来释放这些引用.您还可以使用此方法删除对您为支持视图而创建的任何对象的引用,但现在视图已不再使用.您不应使用此方法来释放用户数据或任何其他无法轻松重新创建的信息.

请记住,viewDidUnload现在应该不需要将对象的引用归零.如果您按照Apple的建议使用ARC,那么您的视图出口就会将弱引用清零.没有你写作,它们会被自动填满viewDidUnload!

此外,清除缓存信息更适合didReceiveMemoryWarning,所以你应该写它:

您可以覆盖此方法以释放视图控制器使用的任何其他内存.如果这样做,那么此方法的实现必须在某个时刻调用超级实现,以允许视图控制器释放其视图.如果视图控制器保留对视图层次结构中视图的引用,则应该在viewDidUnload方法中释放这些引用.

一般来说,人们投入的东西viewDidUnloadviewDidDisappear或更好地处理dealloc.留下的唯一的事情viewDidUnload是nilling任何你的缓存,可以不丢失数据,而视图控制器仍然是开放的需要在某些时候,当视图已经被重新加载后进行重建.(并且,再次,这应该处理didReceiveMemoryWarning.)这些缓存应该懒惰地构建; 当你的应用再次需要它们时,它会悄悄地重建它们.

那你该怎么办viewDidUnload?如果你正在使用ARC:没什么.甚至不写.事实上,自从这个答案被写入以来,Apple已经弃用了viewDidUnload.

因为CGContextRelease,CGContext资源不是Objective-C对象.(你指出了这一点,但我想为后代重复一遍.)因此,它不能被ARC自动解除分配.您有责任确保将其解除分配并按照旧的手动保留释放(MRR)内存管理方案进行分配.

如果您输入此代码viewDidUnload,则无法保证它将被调用.它必须进去dealloc.你也可以把它放进去viewDidUnload,但......

所以:

  1. 没有必要或有帮助.与视图层次结构相比,您的实例变量微不足道.
  2. 没有必要或有帮助.与视图层次结构相比,您的属性微不足道(只要您的属性不是对视图层次结构的强引用).
  3. 这将导致内存泄漏,dealloc通常会在没有内存的情况下调用viewDidUnload.
  4. 没有必要或有帮助.见第1和第2点.


Poc*_*chi 1

viewDidUnload 有一个棘手的名字,如果你仔细思考一下,很容易知道里面的内容。

首先你必须知道的是 iOS 设备具有低内存处理方法。这意味着当设备需要更多内存时,它将检查哪些应用程序可以释放内存。它通过调用 ViewDidUnload 方法(该方法可能命名不正确)来完成此操作。

因此,我们鼓励您在这里将所有可以重建的内容设置为零。(您在 viewdidload 中创建的所有内容)。

例外情况是,由于获取数据或其他内容可能需要时间,因此您确实无法承受丢失对象的后果。

如果您不实现此 viewDidload,您的应用程序将保留其项目和对象,并且 iOS 将无法从中释放任何内容。

所以基本上就像我说的那样,释放(通过将指向这些对象的元素设置为零)您可以在 viewdidload 中安全地重建的所有内容。(在视图被卸载并且想要再次加载之后肯定会调用它)