Objective C 内存管理

拉斐尔

我对 Objective C 很陌生,现在我正在读一本书(在 Mac 6th 版上学习 Objective C)。我在第 9 章(内存管理),我被一个例子困住了。他们给你一个 Car、Tire 和 Engine 类,Car 类有 2 个实例成员,一个指向 Engine 的指针和一个指向 4 个轮胎的数组。所有这些类都有用于实例变量的访问器方法(Getter 和 Setter)。然后,当他们解释对象所有权主题的内存管理最佳策略(释放或保留用于释放的 retainCount 时)时,他们说图像中代码的下一个状态:在此处输入图片说明

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

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

哑光

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

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

[aCar setEngine: anEngine];

......在当时间anEngine相同的对象已经engineaCar假设你这样做了。然后实现setEngine所做的第一件事就是释放现有的engine. 但是如果这个对象也是 newEngine,那么在你有机会将它分配给 ivar 并保留它之前,你现在已经不小心释放了传入的参数。

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

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

我对Objective-C ARC下的内存管理有什么责任?

来自分类Dev

C ++内存管理范例

来自分类Dev

变量的C内存管理

来自分类Dev

C#内存管理

来自分类Dev

C / C ++ argv内存管理

来自分类Dev

Objective-c Opengl内存泄漏

来自分类Dev

Objective c App中的内存泄漏问题

来自分类Dev

Objective-C中的内存分配

来自分类Dev

Objective-c 如何释放内存 Uigraphicsbeginimagecontextwithoptions

来自分类Dev

Objective-C数据管理

来自分类Dev

C ++中的内存管理错误

来自分类Dev

管理内存泄漏C ++的问题

来自分类Dev

C ++类管理着Objective-C类的生命吗?

来自分类Dev

C ++类管理Objective-C类的寿命吗?

来自分类Dev

Objective-C Xcode代码中的内存泄漏

来自分类Dev

Mac OSX Objective-c NSString内存与ARC泄漏

来自分类Dev

Objective-C部分下载的文件以及如何清理内存

来自分类Dev

Objective-C委托内存存储空问题

来自分类Dev

异步C ++代码中的内存管理

来自分类Dev

用C编写内存管理功能?

来自分类Dev

C ++中的constexpr指针和内存管理

来自分类Dev

容器中的C ++ STL内存管理

来自分类Dev

C ++ 11中lambda的内存管理

来自分类Dev

C ++ STL向量载体和内存管理

来自分类Dev

C#对象和内存管理

来自分类Dev

内存泄漏std :: vector管理C ++

来自分类Dev

c ++ vector <vector <int >>如何管理内存

来自分类Dev

在C ++复制删除期间如何管理内存?

来自分类Dev

C ++内存管理-堆栈和堆