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