objective-c - Objective C 内存管理
问题描述
我是 Objective C 的新手,现在我正在读一本书(Learning Objective C on the Mac 6th edition)。我在第 9 章(内存管理),我遇到了一个例子。他们给你一个 Car、Tire 和 Engine 类,Car 类有 2 个实例成员,一个指向 Engine 的指针和一个用于 4 个轮胎的数组。所有这些类都有用于实例变量的访问器方法(Getters 和 Setters)。然后,当他们解释对象所有权主题的内存管理最佳策略(释放或保留用于释放的保留计数时)时,他们会说图像中代码的下一个状态:
注意:engine
setEngine 方法中显示的是 Car 类的实例变量之一
为什么对象的engine
实例变量car2
与 newEngine 参数相同?
解决方案
car2
为什么对象的引擎实例变量和newEngine
Argument一样?
问题是如果你打电话会发生什么
[aCar setEngine: anEngine];
...在某个时间,anEngine
同一个对象已经是的engine
。aCar
假设你这样做了。那么实现的第一件事setEngine
就是释放现有的engine
. 但是,如果这个对象也是 newEngine
,那么您现在在有机会将其分配给 ivar 并保留它之前意外地释放了传入参数。
教训是你需要先保留传入的参数,然后释放现有的engine
——以防它们是同一个对象。或者,更好的是,检查它们是否是同一个对象,正如我在书中建议的那样:
http://www.aeth.com/iOSBook/ch12.html#_memory_management_of_instance_variables_non_arc
说了这么多,我强烈建议你把这本书扔掉。它太旧了。再也没有人写这种代码了。现在我们有 ARC,它可以自动完成所有这些,完全让您不必这样做。在现代 Objective-C 中,说retain
andrelease
实际上是非法的。所以你正在学习一些你永远不会真正去做的事情,这很愚蠢。你正在学习一种死语言。这很有趣,但没用。
推荐阅读
- visual-c++ - VS C++ 可以通过命令行卸载吗?
- tensorflow - 将 tfrecord 文件批量加载到 keras 模型中
- php - 哪种表结构在性能方面更有效
- react-native - 使用 ExtraData 更改 FlatList 中的唯一项
- python - 如何选择具有多个条件的行?
- scala - 将 JSON 从 URL 转换为数据帧(Pyspark 和 Scala)
- javascript - 如何将 api 中的数据和标签插入数据集中以显示图表
- .net - 使用接近设备发送和接收对 APDU 命令的响应
- vue.js - Vue cli 在服务期间删除 outputDir 文件夹
- python - 在 Python 中设置变量的值时出现运行时错误