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