Iphone 第二次加载视图时内存泄漏

Iphone 第二次加载视图时内存泄漏,iphone,objective-c,cocoa,memory-leaks,Iphone,Objective C,Cocoa,Memory Leaks,我一直在为这次内存泄漏而头痛 我的数据源是可变字典,我在viewdidload中加载它。如果我不保留它。我无法在cellforrowatindexpath中访问它。但是当我保留它的时候。。它在仪器中显示为内存泄漏。我试过这么多不同的变体。。似乎做得不对 这是“dict”和“plistPath”中泄漏的代码 ` -(无效)viewDidLoad{ [超级视图下载] self.navigationController.navigationBarHidden = NO; self.title = @

我一直在为这次内存泄漏而头痛

我的数据源是可变字典,我在viewdidload中加载它。如果我不保留它。我无法在cellforrowatindexpath中访问它。但是当我保留它的时候。。它在仪器中显示为内存泄漏。我试过这么多不同的变体。。似乎做得不对

这是“dict”和“plistPath”中泄漏的代码

` -(无效)viewDidLoad{ [超级视图下载]

self.navigationController.navigationBarHidden = NO;

self.title = @"Messages & Lists";


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

[plistPath release];
plistPath = [documentsDirectory stringByAppendingPathComponent:@"general.plist"];

NSFileManager *fileManager = [NSFileManager defaultManager];
[dict release];

if ( [fileManager fileExistsAtPath:plistPath] ) {

    dict = [NSMutableDictionary dictionaryWithContentsOfFile:plistPath] ;


} else {
    dict = [NSMutableDictionary dictionaryWithCapacity:1];

    [dict setObject:@"NO" forKey:@"busyStatus"];
    [dict setObject:@"NO" forKey:@"replyToAll"];
    [dict setObject:@"NO" forKey:@"replyToList"];
    [dict setObject:@"NO" forKey:@"dontReplyToList"];

    [dict writeToFile:plistPath atomically:YES];


}

[tableData release];

tableData = [[NSMutableDictionary alloc] init];

[tableData setObject:[NSArray arrayWithObjects:@"Help",@"Set Default Message",@"Reply To All",[dict objectForKey:@"replyToAll"],nil] forKey:@"1"];
[tableData setObject:[NSArray arrayWithObjects:@"Reply to a List",[dict objectForKey:@"replyToList"],@"List of Contacts",nil] forKey:@"2"];
[tableData setObject:[NSArray arrayWithObjects:@"Don't reply to List",[dict objectForKey:@"dontReplyToList"],@"List of Contacts",nil] forKey:@"3"];


[dict retain];  
[plistPath retain];
}

`

第一次加载视图时没有泄漏。但如果我回来了。然后再次加载它泄漏的视图


提前感谢任何能帮助我的人。

您必须致电
[dict release]
在视图控制器的
dealloc
方法中。

我认为您应该在视图控制器的dealloc方法中释放字典,以便在解除分配视图控制器时减少数据源的保留计数

使用后保留而不释放是内存泄漏的主要原因。

这似乎是正确的。 唯一让我困惑的是tableData。var是否也在其他地方发布或分配

假设您将其分配到其他地方,而不是在dealloc中发布,那么这些步骤不应该是:

  • tableData被分配到其他地方
  • tableData在viewDidLoad中发布
  • 再次分配tableData(计数器1)
  • 退出视图,再次进入视图,再次分配表数据,在功能中释放和分配(计数器2?)

  • 看起来像是一场长跑,但是。您能显示仪器显示的内容吗?

    好的,谢谢。这似乎解决了问题。经验法则:在.h中设置的所有属性(对象)都应该在dealloc方法中释放。还有NARC——新的Alloc,Retain,Copy——如果你做了其中一个,一定要稍后释放这个对象。