【问题标题】:NSDictionary leak misunderstandingNSDictionary 泄漏误区
【发布时间】:2013-10-12 23:51:33
【问题描述】:

请有人告诉我为什么在某些操作之后保留 NSMutabledictionary 是可以的,但在创建时保留会导致泄漏。

-(void) Func2
{
    NSString *_errorDesc;
    NSPropertyListFormat format;
    NSString *_plistPath = [[NSBundle mainBundle] pathForResource:@"List" ofType:@"plist"];
    NSData *_plistData = [[NSFileManager defaultManager] contentsAtPath:_plistPath];
    NSDictionary *dataDict = (NSDictionary *) [NSPropertyListSerialization
                                               propertyListFromData:_plistData
                                               mutabilityOption:NSPropertyListMutableContainersAndLeaves
                                               format:&format
                                               errorDescription:&_errorDesc];



    for (int i = 0; i<[dataDict count]; i++)
    {
        [_ups setObject:[NSArray arrayWithObjects:[NSNumber numberWithInt:0],[NSNumber numberWithInt:0], nil]forKey:[NSString stringWithFormat:@"%d",i]];
    }

    NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
    [defaults setObject:_ups forKey:@"Ups"];
    [defaults synchronize];

}

-(void) Func1
{
    _ups = [NSMutableDictionary dictionary];
    //_ups = [[NSMutableDictionary dictionary]retain]; = leak
    //_ups = [[NSMutableDictionary alloc]init]; = leak


    if(![[NSUserDefaults standardUserDefaults] objectForKey:@"Ups"])
    {
        [self Func2];
    }else{
        _ups = [[NSUserDefaults standardUserDefaults] objectForKey:@"Ups"];
    }
    [_ups retain]; // - ok
}

Instruments->Leaks 显示仅当我尝试在创建时保留时才检测到泄漏,但如果我在填写字典后保留就可以了。

谢谢。

【问题讨论】:

  • 如果你运行分析错误应该很明显。

标签: ios objective-c memory nsdictionary memory-leaks


【解决方案1】:

仅查看if 路径之一(第二个)可简化为:

_ups = [[NSMutableDictionary alloc]init];

// 返回分配给 _ups 的保留实例。

_ups = [[NSUserDefaults standardUserDefaults] objectForKey:@"Ups"];

// 现在一个新的实例被分配给“_ups”而不释放第一个实例。

[_ups retain];

//上面的retain是不正确的,因为方法名不是以“new”开头或者里面没有“copy”。这意味着返回的值应该是自动释放的。查看 Objective-C 命名约定。见Apple's Objective-C Conventions

总而言之,最佳做法是使用 ARC。使用 ARC,第一个实例会自动释放。

【讨论】:

  • 谢谢你救了我的心!知道了。问题已解决)感谢分析仪,帮助我解决更多问题。抱歉不能投票给答案,因为声誉低:(
猜你喜欢
  • 2011-11-08
  • 2011-09-11
  • 2011-05-20
  • 1970-01-01
  • 1970-01-01
  • 2011-06-10
  • 1970-01-01
  • 2011-02-22
  • 1970-01-01
相关资源
最近更新 更多