在下面的代码段(来自一本书)中,data 是一个在 header 中定义的 NSDictionary *data;(无属性)。
在 Controller 的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 非常陌生,有人可以向我解释为什么我不必在退出函数之前保留变量keys、homeDVDs、workDVDs 和值吗?我期望在数据分配之前类似于:
[keys retain];
[homeDVDs retain];
[workDVDs retain];
[values retain];
还是不? InitWithObjects 是否将所有对象复制(递归)到新表中?
假设我们没有最后一行(数据分配),我们是否应该在退出函数之前释放所有 NSArray(或者我们可以安全地假设所有 NSArray 将自动释放,因为没有 分配每一个?)
谢谢!!!
最佳答案
在 Core Foundation 中,大多数对诸如 arrayWithObjects: 之类的方法的静态调用都会返回自动释放的实例,这意味着您不需要(甚至不能!)自己释放它。
因此,执行代码后的情况是,使用 arrayWithObjects: 调用创建的所有数组都会自动释放,但在添加到其他数组或字典时会保留。因此,homeDVD 和 workDVD 在添加到值数组时会被保留,而键和值数组在添加到数据字典时都会被保留。
因此,您不需要显式释放数组,但需要在某个时刻释放数据字典(可能在 dealloc 方法实现中)。
关于iphone - 变量应该释放吗? iphone-sdk,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2491917/