NSDictionary漏洞误解

时间:2013-10-12 23:51:34

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

请有人告诉我为什么在某些操作完成后保留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
}

仪器 - &gt;泄漏表明只有当我试图保留创建时才会检测到泄漏,但是如果我在填写字典后保留完好就可以了。

感谢。

1 个答案:

答案 0 :(得分:1)

仅查看其中一条if路径(第二条)会减少到:

_ups = [[NSMutableDictionary alloc]init];

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

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

//现在将一个新实例分配给&#34; _ups`而不释放第一个实例。

[_ups retain];

//以上保留不正确,因为方法名称不是以&#34; new&#34;或者有&#34;复制&#34;在里面。这意味着返回的值应该是自动释放的。查看Objective-C命名约定。请参阅Apple's Objective-C Conventions

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