0

我已经通过了 Objective-C 文字和类方法,但从记忆的角度来看,我并不清楚。我很困惑使用哪个版本的代码。我有两段代码,我想从内存泄漏的角度了解它们之间的区别。

假设“returnArray”是要返回的数组

版本 1

if([tempArray count] > 0) {
    for(NSDictionary *dict in tempArray) {

        NSDictionary *tempDict = [
                                  [NSDictionary alloc]initWithObjectsAndKeys:
                                  [dict objectForKey:@"verifiedEmail"],@"verifiedEmail",
                                  [dict objectForKey:@"identifier"], @"identifier",
                                  nil
                                  ];

        [returnArray addObject:tempDict];
    }
}

版本 2

if([tempArray count] > 0) {
    for(NSDictionary *dict in tempArray) {
        NSDictionary *tempDict = @{
                                 @"verifiedEmail" : [dict objectForKey:@"verifiedEmail"],
                                 @"identifier" : [dict objectForKey:@"identifier"],
                                 };
        [returnArray addObject:tempDict];
    }
}
4

4 回答 4

2

假设您不使用 ARC:

  • 版本 1,规则规定对象与 alloc、new 或 copy 给对象的保留计数为 1。所以你正在创建 tempdict 而不在将来释放它,这是一个泄漏
  • 版本 2,由于您没有使用上述任何词,因此您正在创建一个自动释放的对象,该对象将进入自动释放池,如果将来没有对象获得其所有权,则该对象将被释放。在这种特殊情况下,阵列将获得所有权。
于 2013-09-20T05:52:43.427 回答
0

版本 1 每次都创建字典,版本 2 提供自动发布的字典版本。版本 2 等效于[NSDictionary dictionaryWithObjectsAndKeys]方法。

于 2013-09-20T05:40:39.097 回答
0

在手动内存管理中,当您获取alloc一个对象时,例如[NSDictionary alloc]initWithObjectsAndKeys:您正在获取一个保留对象。表示您有责任释放该对象。在哪里 [NSDictionary dictionaryWithObjectsAndKeys] 给你一个自动释放的对象。您的代码的第二个版本是现代客观 c 风格创建字典相同[NSDictionary dictionaryWithObjectsAndKeys](特别是替换+[NSDictionary dictionaryWithObjects:forKeys:count:])。在内存问题中,第二个是自动释放的。如果您不确定内存管理,请使用 ARC

于 2013-09-20T05:49:14.847 回答
0

您将使用版本 1 泄漏内存。您分配了一个 NSDictionary,但随后覆盖了它的指针(本地 tempDict),因此无法释放它。版本 2 不会泄漏内存,因为创建 NSDictionary 对象会创建一个自动释放的对象。(所有这些都假设您使用的是手动保留/释放,而不是 ARC。)

于 2013-09-20T05:53:01.087 回答