2

我读过对象保留计数,并且当我们分配第二个值(或对象)时它可以增加。

谁能给我一个关于 retainCount 增加或减少的基本条件的想法(没有 retain , alloc 和 release)......

4

3 回答 3

3

对象的保留计数是您不必担心的实现细节。你真的应该只关心你何时获得和失去一个对象的所有权。原因如下:

+alloc返回一个保留计数为 1 的对象。但是,您立即向它发送一条初始化消息,这可能会给您返回一个完全不同的对象。例如

NSString* foo = [[NSString alloc] initWithString: @"foo"];

给你一个保留计数为 1 的对象,对吧?在 Cocoa 的当前实现上是错误的。+alloc 返回的字符串立即被释放,而是返回对@"foo" 的引用。@"foo" 的保留计数是INT_MAX.

保留一个对象会增加它的保留计数,对吗?可能,但是再次将保留发送到常量字符串没有效果,并且一些单例也有保留的 nul 实现。

同样,释放通常对保留计数有影响,但也不一定出于相同的原因。

发送副本应该给你一个保留计数为 1 的新对象,对吗?错误的。不可变对象可以通过发送自己的保留然后返回自己来实现复制。在大多数情况下,这会将保留计数加一,但当然对于字符串常量,什么也不会发生。

如果您只考虑保留和释放所有权,那么我刚才所说的所有内容都将成为无关紧要的实现细节。

于 2010-11-23T11:26:28.360 回答
3

简短的回答:没有

稍长一点:

通常期望修改保留计数的操作是retain,releaseautorelease调用名称包含newor的方法copy。然而,在某些情况下,出于良好的实施原因,他们可能会这样做,而是做其他事情。您还可以做许多其他事情,例如将对象添加到集合中,这可能会以与您无关的方式修改保留计数。

不要使用或依赖保留计数。它们是一个实现细节。 关心的是管理您自己的所有权,您可以通过上述方法的语义来完成。这如何影响引擎盖下的保留计数是你最好不要看的东西。

请不要。

关注保留计数几乎总是导致错误的一种方式,而不是治愈它们。

于 2010-11-23T09:23:07.810 回答
2

在以下情况下,对象的 retainCount 会发生变化:

  • 当您创建一个对象(new 或 alloc、copy 或 mutablecopy)时,它的保留计数为 1。

  • 当您向对象发送保留消息时,其保留计数会
    增加 1。

  • 当您向对象发送释放消息时,其保留计数
    减 1。

  • 当您向对象发送自动释放消息时,其保留计数将减少 1(不像
    释放的情况那样立即减少,而是在将来的某个时间)

您可以查看这篇文章以获取有关 iPhone 内存管理如何工作的详细信息。

于 2010-11-23T09:26:49.400 回答