首页 > 解决方案 > Objective C 内存管理

问题描述

我是 Objective C 的新手,现在我正在读一本书(Learning Objective C on the Mac 6th edition)。我在第 9 章(内存管理),我遇到了一个例子。他们给你一个 Car、Tire 和 Engine 类,Car 类有 2 个实例成员,一个指向 Engine 的指针和一个用于 4 个轮胎的数组。所有这些类都有用于实例变量的访问器方法(Getters 和 Setters)。然后,当他们解释对象所有权主题的内存管理最佳策略(释放或保留用于释放的保留计数时)时,他们会说图像中代码的下一个状态: 在此处输入图像描述

注意:enginesetEngine 方法中显示的是 Car 类的实例变量之一

为什么对象的engine实例变量car2与 newEngine 参数相同?

标签: objective-cmemory-management

解决方案


car2为什么对象的引擎实例变量和newEngineArgument一样?

问题是如果你打电话会发生什么

[aCar setEngine: anEngine];

...在某个时间,anEngine一个对象已经是的engineaCar假设你这样做了。那么实现的第一件事setEngine就是释放现有的engine. 但是,如果这个对象也是 newEngine,那么您现在在有机会将其分配给 ivar 并保留它之前意外地释放了传入参数。

教训是你需要先保留传入的参数然后释放现有的engine——以防它们是同一个对象。或者,更好的是,检查它们是否是同一个对象,正如我在书中建议的那样:

http://www.aeth.com/iOSBook/ch12.html#_memory_management_of_instance_variables_non_arc

说了这么多,我强烈建议你把这本书扔掉。它太旧了。再也没有人写这种代码了。现在我们有 ARC,它可以自动完成所有这些,完全让您不必这样做。在现代 Objective-C 中,说retainandrelease实际上是非法的。所以你正在学习一些你永远不会真正去做的事情,这很愚蠢。你正在学习一种死语言。这很有趣,但没用。


推荐阅读