ios - NSDictionary泄露误会

标签 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
}

Instruments->Leaks 显示仅当我在创建时尝试保留时才检测到泄漏,但如果我在填充字典后保留则一切正常。

谢谢。

最佳答案

仅查看其中一个 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,第一个实例将自动释放。

关于ios - NSDictionary泄露误会,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19340384/

相关文章:

ios - 自动布局问题

linux - kubectl顶级节点报告的内存利用率高于Linux系统命令

关于 'new'关键字的Java内存问题

c++ - 如何分析内存使用情况?

ios - 在 Facebook 上发布带有文字的图像

ios - 如何在没有操作的情况下呈现新的 UIViewController?

ios - Swift:unwind segue 不起作用

iPhone iOS 使用 UIView animateWithDuration block 执行操作的正确方法是什么?

ios - 如何评估 NSPredicate 中的 NSDictionary

ios - 怎么设置game over在游戏结束的时候和开始的条件一样?