Instruments Leaks 在初始化对象时讲述了内存泄漏

Posted

技术标签:

【中文标题】Instruments Leaks 在初始化对象时讲述了内存泄漏【英文标题】:Instruments Leaks tells about a memory leak when initializing object 【发布时间】:2010-08-18 11:41:57 【问题描述】:

谁能告诉我为什么以下代码泄漏? Instruments 告诉我有 2 次泄漏。明显导致泄漏的 2 行是:

Person *pers = [[Person alloc] init];

NSMutableDictionary *dict = [[NSMutableDictionary alloc] initWithContentsOfFile:path];

整体如下:

PersonViewController *personenDatenController = [[PersonViewController alloc]
          initWithStyle:UITableViewStyleGrouped];

personenDatenController.view.backgroundColor = [UIColor clearColor];

 Person *pers = [[Person alloc] init];

 NSString *path = [[self class] pathForDocumentWithName:@"Person.plist"];
 BOOL fileExists = [[NSFileManager defaultManager] fileExistsAtPath:path];
 if (!fileExists) 
  NSLog(@"file does not exist yet");
  NSString *content = @"";
  NSData *fileContents = [content dataUsingEncoding:NSUTF8StringEncoding];
  [[NSFileManager defaultManager] createFileAtPath:path
            contents:fileContents
             attributes:nil];

 

 NSMutableDictionary *dict = [[NSMutableDictionary alloc] 
         initWithContentsOfFile:path];
 [pers setVorName:[dict valueForKey:@"vorName"]];
 [pers setNachName:[dict valueForKey:@"nachName"]];
 [pers setStrassenName:[dict valueForKey:@"strassenName"]];
 [pers setHausNummer:[dict valueForKey:@"hausNummer"]];
 [pers setPlz:[dict valueForKey:@"plz"]];
 [pers setStadt:[dict valueForKey:@"stadt"]];
 [pers setHandyNummer:(NSInteger*)[dict valueForKey:@"handyNummer"]];
 [pers setEmail:[dict valueForKey:@"email"]];
 [pers setSteuerSatz:[[dict valueForKey:@"steuerSatz"] floatValue]];
 [dict release];


    [personenDatenController setPerson:pers];

    [navigationController pushViewController:personenDatenController animated:YES];

 [personenDatenController release];

    [pers release];

变量“path”来自以下静态方法:

+ (NSString *)pathForDocumentWithName:(NSString *)documentName

 NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
 NSString *documentsDirectory = [paths objectAtIndex:0];
 NSString *tempPath = [documentsDirectory stringByAppendingPathComponent:documentName];

    return tempPath;

提前感谢您的帮助!

亲切的问候

菲尔

【问题讨论】:

看起来不错。也许让静态分析器看看它。请记住,只要 personenDataController 可见,person 对象 应该 就在附近 - 如果您的快照计时不当,可能会被错误地报告为泄漏。最后,也许这个 PersonViewController 会泄露这些对象。 【参考方案1】:

假设 setPerson 调用保留在 pers 上。您的 PersonViewController 是否解除分配,在该人对象上调用释放?如果是这样,在此处放置一个断点(或 NSLog)并找出该人的 retainCount。如果它不为 0,你还能在哪里保留它?

【讨论】:

【参考方案2】:

谢谢大家的回复。 PersonViewController 确实保留了 person 对象,但我在 dealloc 中为 person 对象放了一个释放。保留计数没问题。 我将 Person 对象的初始化移到了 PersonViewController 中,现在一切都很好。这对我来说似乎很奇怪。

谢谢

问候

【讨论】:

以上是关于Instruments Leaks 在初始化对象时讲述了内存泄漏的主要内容,如果未能解决你的问题,请参考以下文章

收到错误“无法附加到任务;尝试在连接的 iPad 上运行 Xcode 7 Instruments、Allocations/Leaks 工具时端口无效

Instruments->Leaks 中的信息按钮和百分比含义

Instruments Leaks - 不显示我的源代码

iOS 内存泄漏检测 Instruments Leaks

iOS 内存泄漏检测 Instruments Leaks

iOS 内存泄漏检测 Instruments Leaks