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

时间:2010-05-25 19:48:59

标签: iphone objective-c release retain

[我确定这根本不奇怪,但我需要一些帮助]

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

有些指导会有所帮助,谢谢!不释放是否正确?

3 个答案:

答案 0 :(得分:3)

你没有必要发布它,这是正确的。

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

self.listContent = someArray                [1]
self.filteredListContent = self.listContent [2]
[self.filteredListContent release]          [1]

self.filteredListContent = somethingElse    [0] -> deallocation of listContent
[self.listContent doSomething]              [whoops, bad things happen]

self.listContent过早解除分配。如果你不使用[... release],那么保留计数数学就可以了。

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

答案 1 :(得分:2)

不,在运行过滤搜索之前,您无需进行retain调用。该物业的任何旧价值都将被释放。

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

答案 2 :(得分:2)

如果您没有NARC *该对象,则无需release它。

* NARC - New,Alloc,Retain,Copy

保留属性retain是分配时的新值,release是发生这种情况时的旧值。