Objective-C对象的保留计数是否可以降至零以下?

时间:2016-09-27 14:04:32

标签: objective-c memory-management release dealloc retaincount

我在Objective-C中学过手动内存管理,每篇文章都说:“当一个对象的保留计数降为0时,调用dealloc方法并销毁该对象”。仅此而已。

但是几个问题没有答案:我可以将保留计数降至0以下吗?是否有可能在对象死亡之前连续多次调用[object release]并导致保留计数降至0以下?如果我这样做了,宇宙还会存在吗?

谷歌没有给我什么,比如:“为什么你甚至会问这个问题?没人关心。再去读一下内存管理。”

2 个答案:

答案 0 :(得分:2)

如果您在保留计数为release时致电1,则会立即调用dealloc。因此,保留计数甚至无法到达0

release的进一步调用将导致运行时崩溃,因为您将取消引用已释放的对象。

所以不,宇宙在那一点上不会存在:)

答案 1 :(得分:-3)

保留计数可以是0或更高但不能更少。当为对象分配堆内存(alloc init)时,保留计数设置为1.然后可以通过调用retain来增加保留计数(据我所知,无限数量的时间,但我可能是错的)。

调用release只会将保留计数减少1.系统会定期检查对象的保留计数,并以0为单位取消分配任何对象。

对已经解除分配的对象调用release与调用NULL对象上的任何方法相同,只需返回NULLvoid即可。但是,如果您是管理堆内存的明确说明,那么您应该非常了解您正在做的事情。

一些有趣的观点:

  

为什么保留计数可以超过1?

这样就不会释放对象,而其他对象仍然需要它。例如。说你有pet ownervetpet实例归owner实例所有。 owner转到vet个实例,vet也取得pet的所有权。有一段时间pet有两个所有者,因此(如果已调用retain)保留计数为2.可以说owner然后在{{1}之前释放} {已完成​​vet;如果一切都已正确完成,则pet将无法解除分配,只需通过pet的{​​{1}}调用将其重新计数减少为1。然后,release可以使用owner完成,调用vetpet将被取消分配。

  

ARC

我确信你已经知道这已被自动引用计数所取代。作为开发人员,我们现在必须简单地了解对象与另一个对象的关系类型。

因此,如果您现在创建一个对象,当它超出范围 时将被取消分配,除非 它与另一个对象具有强关系(拥有)。您仍然可以获得两个对象彼此之间具有牢固关系的重新周期,因此永远不会有资格进行重新分配。

对于很长时间的回答的应用,但内存管理是应用程序编程的核心部分,非常有趣。