保留计数问题:请提供一些指导
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.listContent
和someArray
吗?释放哪一个并不重要,都是同一个对象。 (当然,这只有在属性不是复制属性时才适用。)
@yar:在 Mac 上,我 100% 同意 Vincent Gable,性能/内存损失在那里无关紧要。在 iPhone 上,使用自动释放 可能 会有所作为。但如果你关心这一点,你就不应该使用属性,那些也使用自动释放。
对不起,我错过了上面的评论。是的,我知道无论您使用它的两个名称中的哪一个,该行都会做同样的事情,因为发布操作的是,嗯,变量指向的东西,而不是变量本身。【参考方案2】:
不,您无需在运行过滤器搜索之前拨打retain
电话。该属性中的任何旧值都将被释放。
第一次检查保留计数时,self.filteredListContent
和 self.listContent
引用同一个数组对象,并且都具有该数组的引用计数器。搜索后self.listContent
的保留计数下降到 1,因为它是在设置搜索结果时由self.filteredListContent
释放的(并随后保留)。
【讨论】:
好极了,说得通。【参考方案3】:如果您没有 NARC* 对象,则不需要 release
它。
*NARC -- 新建、分配、保留、复制
retain
s 是分配时的新值,release
s 是发生这种情况时的旧值。
【讨论】:
谢谢,我的错误现在很清楚了,我忘记了retain
属性在获得时基本上是保留,而在获得新属性时是释放。
你的意思是“新的alloc保留副本”!以上是关于保留计数问题:请提供一些指导的主要内容,如果未能解决你的问题,请参考以下文章
UITextView setEnabled:导致保留计数增加?