我在Objective-C中学过手动内存管理,每篇文章都说:“当一个对象的保留计数降为0时,调用dealloc方法并销毁该对象”。仅此而已。
但是几个问题没有答案:我可以将保留计数降至0以下吗?是否有可能在对象死亡之前连续多次调用[object release]
并导致保留计数降至0以下?如果我这样做了,宇宙还会存在吗?
答案 0 :(得分:2)
如果您在保留计数为release
时致电1
,则会立即调用dealloc
。因此,保留计数甚至无法到达0
。
对release
的进一步调用将导致运行时崩溃,因为您将取消引用已释放的对象。
所以不,宇宙在那一点上不会存在:)
答案 1 :(得分:-3)
保留计数可以是0或更高但不能更少。当为对象分配堆内存(alloc init
)时,保留计数设置为1.然后可以通过调用retain
来增加保留计数(据我所知,无限数量的时间,但我可能是错的)。
调用release
只会将保留计数减少1.系统会定期检查对象的保留计数,并以0为单位取消分配任何对象。
对已经解除分配的对象调用release
与调用NULL
对象上的任何方法相同,只需返回NULL
或void
即可。但是,如果您是管理堆内存的明确说明,那么您应该非常了解您正在做的事情。
一些有趣的观点:
为什么保留计数可以超过1?
这样就不会释放对象,而其他对象仍然需要它。例如。说你有pet
owner
和vet
。 pet
实例归owner
实例所有。 owner
转到vet
个实例,vet
也取得pet
的所有权。有一段时间pet
有两个所有者,因此(如果已调用retain
)保留计数为2.可以说owner
然后在{{1}之前释放} {已完成vet
;如果一切都已正确完成,则pet
将无法解除分配,只需通过pet
的{{1}}调用将其重新计数减少为1。然后,release
可以使用owner
完成,调用vet
,pet
将被取消分配。
ARC
我确信你已经知道这已被自动引用计数所取代。作为开发人员,我们现在必须简单地了解对象与另一个对象的关系类型。
因此,如果您现在创建一个对象,当它超出范围 时将被取消分配,除非 它与另一个对象具有强关系(拥有)。您仍然可以获得两个对象彼此之间具有牢固关系的重新周期,因此永远不会有资格进行重新分配。
对于很长时间的回答的应用,但内存管理是应用程序编程的核心部分,非常有趣。