0

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

我有两个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(不幸的是,这是我所期望的)。

一些指导会有所帮助,谢谢!不发布是正确的吗?

4

3 回答 3

3

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

因为变量存储在两个位置,它的保留计数应该是 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]它,则保留计数数学有效。

阅读Vincent Gable 的博客,了解何时使用release的简短摘要。(有趣的是,这篇博文的灵感来自Andiih 在 Stackoverflow 上的回答。)

于 2010-05-25T20:03:19.133 回答
2

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

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

于 2010-05-25T20:03:05.053 回答
2

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

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

保留属性既是retain分配时的新值,release也是发生时的旧值。

于 2010-05-25T20:03:52.853 回答