iphone - 变量应该释放吗? iphone-sdk

标签 iphone cocoa-touch

在下面的代码段(来自一本书)中,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/

相关文章:

iphone - 如何哈希/取消哈希数据文件?

iphone - 寻找 : iOS 6 NSAttributedString Descenders Block Underline 的解决方法

iphone - 从服务器下载高分辨率图像以进行视网膜显示的策略

ios - iPhone 不会忘记测试用户帐户(应用内购买)

iphone - 如何在基于 View 的应用程序中的所有 View 中获取不同的选项卡?

objective-c - iOS iPhone 获取一对多实体

ios - UIFont线程安全吗?

iphone - 动态表格 View 中的静态表格单元格?

iphone - 在 iOS 3 但不是 iOS 4 中的 applicationWillEnterForeground 上的 EXC_BAD_ACCESS

objective-c - 在 iOS 应用程序上保存数据的最有效方式