【问题标题】:Does popping a view controller call release on all of its properties?弹出视图控制器调用是否释放其所有属性?
【发布时间】:2012-12-13 01:22:36
【问题描述】:

我对 IOS 编程比较陌生。我已经完成了一门课程,其中所有的编程都是在没有 ARC 的情况下完成的,我遇到了一个内存管理问题,我希望能得到澄清。

我的情况是这样的:我有一个应用程序,其中“父”视图控制器持有另一个“子”视图控制器,它将推送。所以当这个子视图被推送然后弹出时,它不会被释放,因为父视图会保留它。但即便如此,我认为这个子视图在弹出时仍然会调用其所有属性的释放。我在其中有(非原子,保留)属性,它必须调用这些属性的释放,因为这些字段最终被释放并且在弹出子视图时为空,即使该子视图控制器本身仍然存在。

我以为只要我在前一个视图控制器中持有子视图控制器,即使它被弹出它也不会释放它的任何属性,但我想事实并非如此。我对此是否正确?我找不到,但是否有一个参考页面说明了弹出视图时调用的所有内容?

【问题讨论】:

  • 正如 Bergasms 所说,这不应该发生。查看您的代码会有所帮助。
  • 在阅读了 Bergasms 的回复后,我发现了我的错误。它实际上是由于我使用保留属性从其所属类外部设置对象但使用变量从其所属类内部设置该对象而发生的。在推送和弹出某些视图时以特定方式执行这些集合会导致特定对象被释放。我真的很难解释,但我绝对知道这就是原因。这个属性一开始就没有管理对象的内存,所以我把它改成了assign,问题已经解决了。

标签: ios model-view-controller properties uiviewcontroller retain


【解决方案1】:

不应该是这样的。当您弹出视图控制器时,它会将子项的保留计数减一。但是子控制器不会释放它的元素,直到它的dealloc方法在它的retain达到零时被调用。如果您正确地将其保留在父级中,则不应将其解除分配。

【讨论】:

  • 是的,我现在明白你是对的!经过进一步调查,我似乎无意中通过使用保留属性从其所属类外部设置对象,然后从其所属类内部通过其变量设置该对象来释放对象。以特定方式执行这些设置会使我的对象自行释放,因为属性集将在旧对象上调用释放。我遇到了一些非常奇怪的崩溃,现在更有意义了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-29
  • 2013-07-01
  • 2011-07-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多