我对 Objective C 很陌生,现在我正在读一本书(在 Mac 6th 版上学习 Objective C)。我在第 9 章(内存管理),我被一个例子困住了。他们给你一个 Car、Tire 和 Engine 类,Car 类有 2 个实例成员,一个指向 Engine 的指针和一个指向 4 个轮胎的数组。所有这些类都有用于实例变量的访问器方法(Getter 和 Setter)。然后,当他们解释对象所有权主题的内存管理最佳策略(释放或保留用于释放的 retainCount 时)时,他们说图像中代码的下一个状态:
注意:engine
setEngine 方法中显示的是 Car 类的实例变量之一
为什么对象的engine
实例变量car2
与 newEngine Argument 相同?
为什么
car2
对象的引擎实例变量和newEngine
Argument是一样的?
问题是如果你打电话会发生什么
[aCar setEngine: anEngine];
......在当时间anEngine
是相同的对象是已经在engine
的aCar
。假设你这样做了。然后实现setEngine
所做的第一件事就是释放现有的engine
. 但是如果这个对象也是 newEngine
,那么在你有机会将它分配给 ivar 并保留它之前,你现在已经不小心释放了传入的参数。
这个教训是,你需要保留传入的参数第一和再释放现有的engine
-为了以防万一,他们是同一个对象。或者,更好的是,检查它们是否是同一个对象,正如我在书中建议的那样:
http://www.apeth.com/iOSBook/ch12.html#_memory_management_of_instance_variables_non_arc
说了这么多,我强烈建议你扔掉这本书。它太旧了。没有人再写这种代码了。现在我们有了 ARC,它可以自动完成所有这些工作,完全不需要您这样做。在现代 Objective-C 中,说retain
和release
实际上是非法的。所以你正在学习一些你永远不会真正做的事情,这很愚蠢。你正在学习一门死语言。这很有趣但没有用。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句