我已经读过,对象保留计数,当我们分配第二个值(或对象)时,它可以增加。
任何人都可以让我了解retainCount增加或减少的基本条件(没有保留,分配和释放)......
答案 0 :(得分:3)
简答:不。
稍微长一点:
您通常期望修改保留计数的操作是retain
,release
,autorelease
以及名称包含{{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中的工作方式的详细信息。