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

时间:2010-06-21 18:35:21

标签: iphone ipad

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

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

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

感谢。

2 个答案:

答案 0 :(得分:3)

基础容器(如NSArrayNSDictionary)保留其直接拥有的对象,但不保留对象拥有的子对象。

例如,如果NSArray*a包含NSArray*b,而NSArray*c包含a,则b会保留bc会保留a但是c不保留x

那就是说,你从错误的角度思考。它是不正确让你想知道“在将x传递给另一个对象y之前,我是否必须保留此对象(比如说y},因为{ {1}}可能不会恰当地保留它?“ retain / release的要点是确保对象保留并释放它拥有的对象。您相信其他对象也可以这样做。

然后,您必须确保将对象x放入数组y,是否一旦它变为x(如果它没有自动释放) 对您不必要。如果y需要它,y会保留它,因此您无需关心它。

假设您已预先存在NSMutableArray*array。然后你会用这样的方法做:

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

你知道,如果该数组需要它,那么数组有责任保留字典。它需要它,所以它保留它。你不必关心那个。

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

再次:retain / release的重点是允许您在代码中非常本地地考虑对象的生命周期。

每当您通过传递对象method:来调用另一个对象a的方法b时,您现在不必担心method:是否保留b是{1}},如果在将b传递给b之前需要保留method:,则无需担心。

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

答案 1 :(得分:1)

Objective-C容器(例如NSMutableArray)将保留添加到它们的对象。

然而,这与“传播”的任何事情无关 - 无论你是否在NSMutableArray上调用-retain都是无关紧要的。 NSMutableArray将只保留添加到其中的对象,如果这些对象本身是某种容器(例如字典),则子对象本身已经保留了添加到它们的任何内容,依此类推。

PS。没有真正的“保留属性”,每个对象都有一个(内部)“保留计数”。例如,如果您创建一个NSString并将其添加到3个NSMutableArray,那么每个阵列都会retain