释放UIViewController作为属性

时间:2012-07-11 04:57:25

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

iOS应用程序存在一个有趣的内存管理问题。

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

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

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

    更多细节:

    该属性是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]发布

1 个答案:

答案 0 :(得分:0)

添加另一个viewController的视图作为子视图必然会引起奇怪的问题,当你释放另一个viewController时,它的视图仍然会被你的主视图保留,但它的viewController将会消失。

self.propertyName = nil是发布属性的最佳方式,只需确保首先从主视图中删除了子视图。