在下面的一段代码中(来自一本书)数据是标题中定义的 NSDictionary *数据; (无属性)。
在控制器的 viewDidLoad 中,会发生以下情况:
- (void)viewDidLoad {
[super viewDidLoad];
NSArray *keys = [NSArray arrayWithObjects:@"home", @"work", nil];
NSArray *homeDVDs = [NSArray arrayWithObjects:@"Thomas the Builder", nil];
NSArray *workDVDs = [NSArray arrayWithObjects:@"Intro to Blender", nil];
NSArray *values = [NSArray arrayWithObjects:homeDVDs, workDVDs, nil];
data = [[NSDictionary alloc] initWithObjects:values forKeys:keys];
}
由于我对Objective-c真的很新,有人可以向我解释为什么在退出函数之前我不必保留变量键,homeDVDs,workDVDs和值?我希望之前的数据分配类似于:
[keys retain];
[homeDVDs retain];
[workDVDs retain];
[values retain];
是不是? InitWithObjects 是否(递归地)将所有对象复制到新表中?
假设我们没有最后一行(数据分配),我们应该在退出函数之前释放所有NSArrays(或者我们可以安全地假设所有NSArrays都将被自动释放,因为没有 alloc 每一个?)
感谢!!!!
答案 0 :(得分:5)
在Core Foundation中,大多数对方法(如arrayWithObjects)的静态调用都会返回自动释放的实例,这意味着您不需要(甚至不能!)自己释放它。
因此执行代码后的情况是,使用arrayWithObjects:调用创建的所有数组都是自动释放的,但在添加到其他数组或字典时会保留。因此,添加到数值数组时,homeDVD和workDVD将被保留,并且在添加到数据字典时,键和值数组都会被保留。
所以你不需要显式发布你的数组,但是你需要在某个时候发布你的数据字典(可能在dealloc方法实现中)。
答案 1 :(得分:0)
NSDictionary
复制关键字段,保留值。您的所有其他实例都是自动释放的,因此您不会错过任何版本或保留(假设您在data
方法中发布dealloc
)。