我有一个保留的可变数组。
此数组包含包含大量键的字典。每个字典都包含对象。
在将字典添加到可变数组之前是否必须保留字典,或者数组本身是否会保留添加到其中的所有内容(因为它已被保留),包括层次结构中对象的子对象?
感谢。
答案 0 :(得分:3)
基础容器(如NSArray
或NSDictionary
)保留其直接拥有的对象,但不保留对象拥有的子对象。
例如,如果NSArray*a
包含NSArray*b
,而NSArray*c
包含a
,则b
会保留b
,c
会保留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
。