需要了解以下代码在内存泄漏方面的行为差异

时间:2013-09-20 05:33:34

标签: iphone ios objective-c xcode memory-leaks

我已经通过了Objective-C literals&类方法,但我从Memory的观点来看并不清楚。我很困惑使用哪个版本的代码。我有两段代码&我想从Memory Leak的观点来理解它们之间的区别。

假设“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 个答案:

答案 0 :(得分:2)

假设您没有使用ARC:

  • 版本1,规则声明带有alloc,new或copy的对象给对象一个保留计数为1.所以你创建一个tempdict而不会在将来发布它,这是一个泄漏
  • 版本2,因为你没有使用上面的任何一个词,你正在创建一个自动释放的对象,进入自动释放池,将来这个对象如果没有它将取得它的所有权将被释放。在该特定情况下,阵列将获得所有权。

答案 1 :(得分:0)

版本1每次都在创建一个字典,第二版正在发布一个自动发布的字典版本。 版本2相当于[NSDictionary dictionaryWithObjectsAndKeys]方法。

答案 2 :(得分:0)

alloc [NSDictionary alloc]initWithObjectsAndKeys:对象(例如[NSDictionary dictionaryWithObjectsAndKeys]}获得保留对象时,在手动内存管理中。表示您有责任释放该对象。 [NSDictionary dictionaryWithObjectsAndKeys]为您提供自动释放对象的位置。您的第二个版本的代码是现代目标c样式创建字典,与{{1}}相同(特别是替换 + [NSDictionary dictionaryWithObjects:forKeys:count:] )。在记忆中,第二个是自动释放。如果您不确定内存管理使用ARC

答案 3 :(得分:0)

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