【发布时间】:2011-05-14 08:26:12
【问题描述】:
我已经读到对象保留计数,并且当我们分配第二个值(或对象)时它可以增加。
谁能给我一个关于 retainCount 增加或减少的基本条件的想法(没有 retain , alloc 和 release)...
【问题讨论】:
标签: objective-c memory-management retaincount
我已经读到对象保留计数,并且当我们分配第二个值(或对象)时它可以增加。
谁能给我一个关于 retainCount 增加或减少的基本条件的想法(没有 retain , alloc 和 release)...
【问题讨论】:
标签: objective-c memory-management retaincount
对象的保留计数是您不必担心的实现细节。你真的应该只关心你何时获得和失去一个对象的所有权。原因如下:
+alloc 返回一个保留计数为 1 的对象。但是,您立即向它发送一条初始化消息,这可能会给您返回一个完全不同的对象。比如
NSString* foo = [[NSString alloc] initWithString: @"foo"];
给你一个保留计数为 1 的对象,对吧?在 Cocoa 的当前实现上是错误的。 +alloc 返回的字符串立即被释放,而是返回对@"foo" 的引用。 @"foo" 的保留计数为INT_MAX。
保留一个对象会增加它的保留计数,对吗?可能,但是再次将保留发送到常量字符串没有效果,并且一些单例也有保留的 nul 实现。
同样的释放通常对保留计数有影响,但也不一定出于相同的原因。
发送副本应该会给您一个保留计数为 1 的新对象,对吗?错误的。不可变对象可以通过发送自己的保留然后返回自己来实现复制。在大多数情况下,这会使保留计数加一,但当然对于字符串常量,什么也不会发生。
如果您只考虑保留和释放所有权,那么我刚才所说的所有内容都将成为无关紧要的实现细节。
【讨论】:
对象的retainCount在以下情况下发生变化:
当你创建一个对象(新的或 alloc、copy 或 mutablecopy),它有一个 保留计数为 1。
当您向对象发送保留时
消息,其保留计数为
增加 1。
当您向对象发送释放时
消息,其保留计数为
减 1。
当您发送自动释放消息时
到一个对象,它的保留计数
将减 1(不
立即释放,但
未来一段时间)
您可以查看此post 以获取有关 iPhone 内存管理工作原理的详细信息。
【讨论】:
简短回答:否。
稍长一点:
您通常期望修改保留计数的操作是retain、release、autorelease 和名称包含new 或copy 的调用方法。然而,在某些情况下,出于良好的实施原因,他们可能不这样做,而是做其他事情。还有许多您可以做的其他事情,例如将对象添加到集合中,这可能会以与您无关的方式修改保留计数。
不要使用或依赖保留计数。它们是一个实现细节。 您关心的是管理您自己的所有权,您可以通过上述方法的语义来做到这一点。这会如何影响引擎盖下的保留计数,最好不要看。
请不要这样做。
关注保留计数几乎总是导致错误的一种方式,而不是解决错误。
【讨论】:
autorelease 不会改变保留计数。