保留计数问题:请提供一些指导

Posted

技术标签:

【中文标题】保留计数问题:请提供一些指导【英文标题】:Retain Count Question: Some Guidance, Please 【发布时间】:2010-05-25 19:48:59 【问题描述】:

[我确信这一点都不奇怪,但我需要一点帮助]

我有两个retain 属性

@property (nonatomic, retain) NSArray *listContent;
@property (nonatomic, retain) NSArray *filteredListContent;

viewDidLoad 方法中,我将第二个设置为等于第一个(所以我认为现在retainCount 是两个):

self.filteredListContent = self.listContent;

然后在每次搜索时我都会这样做

 self.filteredListContent  = [listContent filteredArrayUsingPredicate:predicate];

我想我应该在这个分配的正上方做一个release——因为这个属性应该会导致额外的保留,对吧? -- 但这会导致程序在我第二次运行搜索方法时爆炸。保留计数(没有额外的release)在我第一次进入搜索方法时为 2,随后每次为 1(不幸的是,这是我的预期)。

一些指导会有所帮助,谢谢!不发布对吗?

【问题讨论】:

【参考方案1】:

你不必释放它,这是正确的。

因为变量存储在两个位置,它的保留计数应该是 2。这是它崩溃的原因。 (保留括号中 self.listContent 的数量。)

self.listContent = someArray [1] self.filteredListContent = self.listContent [2] [self.filteredListContent 发布] [1] self.filteredListContent = somethingElse [0] -> listContent 的释放 [self.listContent doSomething] [哎呀,坏事发生了]

self.listContent 过早地被释放。如果您不使用[... release]it,则保留计数数学有效。

阅读Vincent Gable's blog 了解何时使用发布的简短摘要。 (有趣的是,这篇博文的灵感来自Andiih's answer on ***。)

【讨论】:

我认为您的意思是第 3 行中的 [self.filteredlistContent release],但除此之外很好解释 那篇博客文章不是在争论使用autorelease 的频率高于其他人的推荐吗? @yar:你知道self.filteredListContent 等于self.listContentsomeArray 吗?释放哪一个并不重要,都是同一个对象。 (当然,这只有在属性不是复制属性时才适用。) @yar:在 Mac 上,我 100% 同意 Vincent Gable,性能/内存损失在那里无关紧要。在 iPhone 上,使用自动释放 可能 会有所作为。但如果你关心这一点,你就不应该使用属性,那些也使用自动释放。 对不起,我错过了上面的评论。是的,我知道无论您使用它的两个名称中的哪一个,该行都会做同样的事情,因为发布操作的是,嗯,变量指向的东西,而不是变量本身。【参考方案2】:

不,您无需在运行过滤器搜索之前拨打retain 电话。该属性中的任何旧值都将被释放。

第一次检查保留计数时,self.filteredListContentself.listContent 引用同一个数组对象,并且都具有该数组的引用计数器。搜索后self.listContent 的保留计数下降到 1,因为它是在设置搜索结果时由self.filteredListContent 释放的(并随后保留)。

【讨论】:

好极了,说得通。【参考方案3】:

如果您没有 NARC* 对象,则不需要 release 它。

*NARC -- 新建、分配、保留、复制

retains 是分配时的新值,releases 是发生这种情况时的旧值。

【讨论】:

谢谢,我的错误现在很清楚了,我忘记了 retain 属性在获得时基本上是保留,而在获得新属性时是释放。 你的意思是“新的alloc保留副本”!

以上是关于保留计数问题:请提供一些指导的主要内容,如果未能解决你的问题,请参考以下文章

需要有关引用计数的指导

UITextView setEnabled:导致保留计数增加?

来自不同列的元素计数的条形图 - 指导

为啥在调试模式和运行模式下保留计数不同?

list.count 是不是物理地遍历列表以对其进行计数,或者它是不是保留一个指针

了解分配仪器保留计数