【问题标题】:How to remove outside UIViews from UIViewController?如何从 UIViewController 中删除外部 UIViews?
【发布时间】:2024-01-04 07:19:01
【问题描述】:

我在 UIViewController 之外添加了多个 UIView,并且所有视图都连接了周插座。弹出返回 ViewController 时如何释放所有视图的内存。

【问题讨论】:

  • 你不使用ARC吗??
  • 您是否收到任何内存警告??
  • 如果弱的话,我相信你也不用担心。
  • 不,我没有使用 ARC。我用过 MVC。
  • 没有收到内存警告,但当我弹回时内存没有减少。

标签: ios objective-c xcode ios8 ios9


【解决方案1】:

首先:xib 顶层的视图(或其他对象)在其相应的视图控制器中不应具有weak 类型的属性。与视图层次结构中的视图不同,它们在加载 xib 后没有所有者,因此无论如何它们都会被释放。

现在您似乎直接使用 ivars(为什么?),所以我实际上不确定,但我认为这没有什么区别。假设 Interface Builder 接受这些作为 outlet 并设置它们,它们很快就会消失而没有所有者。

从这个角度来看,你已经节省了内存......

如果不了解您的项目的更多信息,我无法确定,但事实上您没有在遇到nil 问题时寻求帮助,这让我猜想您在其他地方拥有这些视图的所有权。要释放它们,您需要设置任何属性(希望您很快会为此使用属性)将它们强烈引用到nil。 ARC 会为您完成剩下的工作。不使用ARC?开始使用吧……

我建议对此进行重组。给视图控制器(我猜这是某种FirstFlyerViewController)强大的properties 给视图(如果您确实需要将它们放在视图层次结构之外,否则,只需将它们作为子视图添加到某处)。使用它们,一旦你弹出视图控制器,它就会被释放(注意这通常是由框架完成的,而不是你自己完成的),它们也会随之释放。

【讨论】:

  • 我很感激,但我没有使用 ARC.. 如果没有 ARC,我如何删除所有视图?
  • 如果您不使用 ARC,则不应使用 __strong__weak 关键字,它们在概念上属于 ARC(与它一起引入)。我很惊讶编译器没有抱怨。要放弃视图的所有权,请向他们发送发布消息:[aView release]。但正如我所说,这假设您确实在某处拥有所有权。截图暗示你没有。我强烈建议您重新考虑您的 xib 和应用程序结构。还要考虑使用属性。