变量是否应该被释放? iphone-SDK

时间:2010-03-22 11:52:41

标签: iphone cocoa-touch

在下面的一段代码中(来自一本书)数据是标题中定义的 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 每一个?)

感谢!!!!

2 个答案:

答案 0 :(得分:5)

在Core Foundation中,大多数对方法(如arrayWithObjects)的静态调用都会返回自动释放的实例,这意味着您不需要(甚至不能!)自己释放它。

因此执行代码后的情况是,使用arrayWithObjects:调用创建的所有数组都是自动释放的,但在添加到其他数组或字典时会保留。因此,添加到数值数组时,homeDVD和workDVD将被保留,并且在添加到数据字典时,键和值数组都会被保留。

所以你不需要显式发布你的数组,但是你需要在某个时候发布你的数据字典(可能在dealloc方法实现中)。

答案 1 :(得分:0)

NSDictionary 复制关键字段,保留值。您的所有其他实例都是自动释放的,因此您不会错过任何版本或保留(假设您在data方法中发布dealloc)。