目标C内存管理

问题描述 投票:0回答:1

我在Objective C方面还很陌生,现在我正在读一本书(在Mac第6版上学习Objective C)。我在第9章(内存管理),仅举一个例子。它们为您提供了Car,Tire和Engine类,Car类具有2个实例成员,一个指向Engine的指针和一个用于4个Tires数组的指针。所有这些类都有用于实例变量的Accessors方法(Getters和Setters)。然后,当他们解释对象所有权主题的最佳内存管理策略(释放或保留retainCount进行释放时)时,他们说出图像中代码的下一个状态:enter image description here

注意:setEngine方法中显示的engine指向Car类的实例变量之一

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

objective-c memory-management
1个回答
0
投票

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

问题是如果您打电话给会发生什么>

[aCar setEngine: anEngine];

...当anEngine相同对象

时,即[[已经 engineaCar。假设您这样做了。然后,setEngine实现的第一件事就是释放现有的engine。但是,如果该对象是[[also newEngine,那么在您有机会将其分配给ivar并保留它之前,您现在不小心释放了传入的参数。课程是,您需要保留传入的参数first,然后

then

释放现有的engine,以防万一它们是同一对象。或者,甚至更好的是,正如我在我的书中所建议的,检查看看它们是否是同一对象:
http://www.apeth.com/iOSBook/ch12.html#_memory_management_of_instance_variables_non_arc说了这么多,我强烈建议您把这本书扔掉。太旧了

没有人

再写这种代码。如今,我们有ARC可以完全自动执行所有这些操作,因此您不必这样做。在现代的Objective-C中,说retainrelease实际上是

非法

。因此,您正在学习一些您永远不会真正做的事情,这很愚蠢。您正在学习一门废话。很好玩,但没有用。
© www.soinside.com 2019 - 2024. All rights reserved.