0

我在 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]

4

1 回答 1

0

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

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

于 2012-11-06T03:08:13.293 回答