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

pse*_*bos 2 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];

}
Run Code Online (Sandbox Code Playgroud)

由于我对Objective-c真的很新,有人可以向我解释为什么在退出函数之前我不必保留变量键,homeDVD,workDVD和值?我希望之前的数据分配类似于:

[keys retain];
[homeDVDs retain];
[workDVDs retain];
[values retain];
Run Code Online (Sandbox Code Playgroud)

或不?InitWithObjects是否(递归地)将所有对象复制到新表中?

假设我们没有最后一行(数据分配),我们应该释放所有NSArrays退出函数之前(或者我们可以安全地假定所有NSArrays将被自动释放,因为没有页头为每一个?)

谢谢!!!!

Mat*_*hes 5

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

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

因此,您不需要显式释放数组,但是您需要在某个时刻发布数据字典(可能在dealloc方法实现中).