retainCount增加或减少的条件

时间:2010-11-23 09:10:34

标签: objective-c memory-management retaincount

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

任何人都可以让我了解retainCount增加或减少的基本条件(没有保留,分配和释放)......

3 个答案:

答案 0 :(得分:3)

简答:

稍微长一点:

通常期望修改保留计数的操作是retainreleaseautorelease以及名称包含{{1}的调用方法}或new。但是,在某些情况下,出于良好的实施原因,他们可能这样做,而是做其他事情。还有许多可以执行的其他操作,例如向集合中添加对象,这可能会以而不是您的业务的方式修改保留计数。

不要使用或依赖保留计数。它们是一个实现细节。 关注的是管理您自己的所有权,您可以通过上述方法的语义来执行此操作。如何影响引擎盖下的保留计数是你最好甚至不看。

请不要。

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

答案 1 :(得分:3)

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

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

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

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

保留一个物体会增加其保留计数,对吧?可能,但是再次将retain发送到常量字符串没有任何效果,并且一些单例也实现了保留。

类似地,释放通常会对保留计数产生影响,但同样不一定是出于同样的原因。

发送副本应该为您提供一个保留计数为1的新对象吗?错误。不可变对象可以通过发送自身保留然后返回自己来实现副本。在大多数情况下,这将为保留计数添加一个,但当然使用字符串常量,没有任何反应。

如果您只是考虑保留和释放所有权,我刚刚说过的所有内容都变成了无关的实施细节。

答案 2 :(得分:2)

在下列情况下,

对象的retainCount会发生变化:

  • 创建对象时(new或 分配,复制或mutablecopy),它有一个 保留计数为1。

  • 发送对象时保留 消息,其保留计数为
    增加1。

  • 发送对象时发布 消息,其保留计数为
    递减1。

  • 发送自动发布消息时 对象,它的保留计数 将减1(不是
    立即发布但是

您可以查看此post以获取有关内存管理在iPhone中的工作方式的详细信息。