【问题标题】:Objective C Memory ManagementObjective C 内存管理
【发布时间】:2020-01-27 06:14:11
【问题描述】:

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

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

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

【问题讨论】:

  • “2011 年 10 月 12 日,Xcode 4.2 与 iOS 5.0 的发布同时发布,它包含更多和改进的功能,例如故事板和自动引用计数 (ARC)。”那本书似乎真的过时了。您可能应该首先学习当前版本的 Objective-C。

标签: objective-c memory-management


【解决方案1】:

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

问题是如果你打电话给

会发生什么
[aCar setEngine: anEngine];

...此时anEngine相同的对象已经aCarengine。假设你这样做了。那么setEngine 的实现首先要做的是释放现有的engine。但是如果这个对象也是newEngine,那么你现在已经不小心释放了传入的参数,然后你有机会将它分配给ivar并保留它。

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

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

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

【讨论】:

  • 非常感谢您的建议,只是我即将为 IOS 8(或更高版本)做一些项目(一个框架),我被要求用这个特定的语言而不是迅速。 ARC已经被Objective C支持了?,你知道一些可以帮助我使用Objective C的参考吗?我真的很感激。
  • “你正在学习一种死语言。” - 这听起来有点太激烈了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-08
  • 2011-05-11
相关资源
最近更新 更多