代码之家  ›  专栏  ›  技术社区  ›  tom

使用保留和自动释放指定给另一个对象

  •  0
  • tom  · 技术社区  · 12 年前

    我有下面的代码,期望一旦obj2被释放,obj1仍然被保留,它能工作吗?

    obj1 = [[Class1 alloc] init];
    obj2 = [[obj1 retain] autorelease];
    
    2 回复  |  直到 12 年前
        1
  •  4
  •   Caleb    12 年前

    我有下面的代码,期望一旦obj2被释放,obj1仍然被保留,它能工作吗?

    obj1 obj2 都是指向 同一对象 。创建该对象时,该对象的保留计数为1。在第二行再次保留时,对象的保留数将增加到2。因此,该对象(以及指向它的任何指针)将保持有效,直到它被释放两次为止。其中一个版本最终将来自 autorelease 在第二条线上;另一个应该由您的代码提供。

        2
  •  2
  •   bbum    12 年前

    它会起作用,但我不确定你的结论是否正确(在这方面有一个解析错误)。

    obj1 = [[Class1 alloc] init];
    obj2 = [[obj1 retain] autorelease];
    

    这有助于从delta和per-reference的角度考虑保留和释放。因此,在下面的代码中,您会说“obj1引用的保留计数为+1”和“obj2引用的保留数为+0”。

    也就是说, obj1 是一个强有力的参考 obj2 是一个薄弱的参考。

    如果你想让物体消失,你会 [obj1 release] 能够 [obj2 release] ,但这意味着所有权转让,只有在有充分理由且非常明确的情况下才能进行。

    或者,你可以打开ARC并完成它。