我在 iOS 应用程序中遇到了一个有趣的内存管理问题。
我有一个属性,在发布使用时
[self.propertyName release];
会导致该属性被释放两次,并导致 iPad 1/iOS 4 设备(在属性的 dealloc 中)出现错误的内存访问异常。当此代码更改为
[_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]