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]
发布
答案 0 :(得分:0)
添加另一个viewController的视图作为子视图必然会引起奇怪的问题,当你释放另一个viewController时,它的视图仍然会被你的主视图保留,但它的viewController将会消失。
说self.propertyName = nil
是发布属性的最佳方式,只需确保首先从主视图中删除了子视图。