【问题标题】:Releasing a UIViewController as a property释放 UIViewController 作为属性
【发布时间】:2012-07-11 04:57:24
【问题描述】:

我在 iOS 应用程序中遇到了一个有趣的内存管理问题。

  1. 我有一个属性,当使用[self.propertyName release]; 释放该属性时,会导致该属性被释放两次,并导致 iPad 1/iOS 4 设备(在属性的 dealloc 中)出现错误的内存访问异常。

  2. 当此代码更改为[_propertyName release];(访问局部变量而不是属性)时,这将导致 iPad 3/iOS 5 上的泄漏。

当然,我可以通过检查操作系统版本来阻止这种情况发生,但我想了解我做错了什么。

更多细节:

该属性是UIViewController 的子类,拥有该属性的对象也是如此。我将属性的UIView 添加为子视图。我听说这不是一个好的做法,但我们正在其他地方这样做,没有内存问题。

测试用例是:

  • iPad 1、iOS 4.2 - 需要使用 ivar [_propertyName release] 发布

  • iPad 2、iOS 5.0 - 需要使用[self.propertyName release]属性发布

  • iPad 3、iOS 5.1 - 需要使用 [self.propertyName release] 属性发布

【问题讨论】:

  • 我们需要代码才能继续。显示这个 var 的声明,以及你在哪里释放它。

标签: objective-c ios memory-management memory-leaks


【解决方案1】:

将另一个 viewController 的视图添加为子视图势必会导致奇怪的问题,当您释放另一个 viewController 时,它的视图仍会被您的主视图保留,但它的 viewController 会消失。

也就是说self.propertyName = nil 是释放属性的最佳方式,只需确保您首先从主视图中删除了子视图。

【讨论】:

    猜你喜欢
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 2013-06-03
    • 2016-12-09
    • 2012-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多