[我确定这根本不奇怪,但我需要一些帮助]
我有两个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(这是我预期的,不幸的是)。
有些指导会有所帮助,谢谢!不释放是否正确?
答案 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.filteredListContent
和self.listContent
引用相同的数组对象,并且两者都有该数组的引用计数器。在搜索self.listContent
之后,保留计数降至1,因为self.filteredListContent
在设置搜索结果(并随后保留)时将其释放。
答案 2 :(得分:2)
如果您没有NARC *该对象,则无需release
它。
* NARC - New,Alloc,Retain,Copy
保留属性retain
是分配时的新值,release
是发生这种情况时的旧值。