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

iphone-retain属性会在数组上传播吗?

  •  0
  • Duck  · 技术社区  · 15 年前

    我有一个已保留的可变数组。

    此数组包含具有大量键的字典。每个字典都包含对象。

    在将字典添加到可变数组之前,我是否必须保留字典,或者数组本身是否保留添加到字典中的所有内容(因为它已经保留),包括其层次结构中对象的子对象?

    谢谢。

    2 回复  |  直到 15 年前
        1
  •  3
  •   Yuji    15 年前

    一个基础容器,像 NSArray NSDictionary 保留它直接拥有的对象,但不保留对象拥有的子对象。

    例如,如果 NSArray*a 包含 NSArray*b 它依次包含 NSArray*c , a 保留 b 保留 c 但是 不保留 C .

    也就是说,你的想法是错误的。它是 不正确 你想知道“我必须保留这个物体吗”(比如 x )超车前 X 到另一个对象 y ,因为 Y 可能无法适当保留?”要点 retain / release 这是为了确保一个对象保留并释放它拥有的对象。您信任其他对象也这样做。

    那么,你要做的就是确保你放了一个物体 X 数组 Y ,是为了你不释放 X (如果不是自动释放)一旦它变成 对你来说没必要 . 如果 Y 需要它, Y 保留着它,所以你不必关心它。

    假设你有一个预先存在的 NSMutableArray*array . 然后你可以用这样的方法:

     NSMutableDictionary* dictionary=[[NSMutableDictionary alloc] init];
     ... do something with dictionary ... 
     [array addObject:dictionary];
     [dictionary release];
    

    你看,如果数组需要字典的话,保留字典是数组的责任。它需要它,所以它保留了它。你不必担心。

    方法的职责是,如果方法需要字典,则保留字典;如果方法不再需要字典,则释放字典。因此,如上面所示,方法在完成后通过将其添加到数组中来释放它。

    再说一遍:关键是 保持 / 释放 允许您在代码中非常局部地考虑对象的生命周期。

    每当你调用一个方法 method: 其他对象的 通过传递对象 你不必像现在这样担心 方法: 保留 或者没有,如果你需要保留 传球前 方法: .

    这是因为cocoa框架中的每个方法以及您编写的每个方法都保留了对象 如果该方法稍后需要,则传递给它,并且不保留 如果以后不需要的话。

        2
  •  1
  •   David Gelhar    15 年前

    目标-C容器(如 NSMutableArray )将保留添加到其中的对象。

    然而,这与“传播”无关——无论您是否调用 -retain 关于非诱变性是无关紧要的。nsmutableArray只保留添加到其中的对象,如果这些对象本身是某种容器(如字典),则子对象本身已经保留了添加到其中的任何内容,等等。

    附言:没有真正的“保留属性”,每个对象都有一个(内部的)“保留计数”。例如,如果创建一个nsstring并将其添加到3个nsmutableArray中,那么每个数组都将 retain 它。

    推荐文章