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

时间:2010-06-23 07:01:37

标签: iphone objective-c cocoa memory-leaks

我一直在讨论这个记忆漏洞。

我的数据源是mutabledictionary ..我在viewdidload中加载。如果我不保留它我没有在cellforrowatindexpath中访问它。但是当我保留它时......它显示为仪器中的内存泄漏。我尝试了很多不同的变化..似乎没有做对。

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

` - (void)viewDidLoad {     [super 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];

}

`

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

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

3 个答案:

答案 0 :(得分:2)

您必须在视图控制器的[dict release]方法中调用dealloc

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

看来是对的。 唯一令我困惑的是tableData。这个var也是在其他地方发布或分配的吗?

假设您确实将其分配到其他地方,而不是在dealloc中释放它,那么这些步骤不应该是:

  1. tableData分配到其他地方。
  2. tableData在viewDidLoad
  3. 中发布
  4. 再次分配tableData(计数器1)。
  5. 退出视图,再次输入视图,再次分配tableData,在功能中释放和分配(计数器二?)
  6. 看起来像是一个远景,但是。你能展示乐器说的吗?