代码之家  ›  专栏  ›  技术社区  ›  Dan Rosenstark

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

  •  0
  • Dan Rosenstark  · 技术社区  · 15 年前

    [我相信这一点也不奇怪,但我只需要一点帮助]

    我有两个 retain 性质

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

    而在 viewDidLoad 方法我将第二个值设置为第一个值(我认为现在的重新计数是两个):

    self.filteredListContent = self.listContent;
    

    每次搜索我都会这样做

     self.filteredListContent  = [listContent filteredArrayUsingPredicate:predicate];
    

    我想我应该做一个 release 就在这项转让的正上方——因为财产应该造成额外的保留,对吗?--但这会导致程序爆炸 第二次运行搜索方法 . 保留计数(不包括额外的 释放 )第一次进入搜索方法时是2,以后每次是1(不幸的是,这是我所期望的)。

    一些指导会有帮助的,谢谢!不释放是正确的吗?

    3 回复  |  直到 15 年前
        1
  •  3
  •   Community CDub    8 年前

    你不必释放它,没错。

    因为变量存储在两个位置,所以其保留计数应为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 )

        2
  •  2
  •   Daniel Johnson    15 年前

    不,你不需要 retain 在运行筛选搜索之前调用。将释放属性中的任何旧值。

    第一次检查保留计数时, self.filteredListContent self.listContent 引用同一数组对象,并且两者都有该数组的引用计数器。搜索之后 self.listcontent(自我列表内容) 的保留计数下降到1,因为它是由 self.filteredlistcontent(self.filteredlistcontent) 当设置搜索结果(并随后保留)时。

        3
  •  2
  •   bbum    15 年前

    如果你不麻醉这个物体,你就不需要 release 它。

    *新的,分配的,保留的,复制的

    保留的财产 retain 是新的工作分配值和 释放 这是旧的价值观。