我一直在讨论这个记忆漏洞。
我的数据源是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];
}
`
第一次加载视图时没有泄漏。但如果我回来了然后再次加载视图它会泄漏。
提前感谢任何可以帮助我的人。
答案 0 :(得分:2)
您必须在视图控制器的[dict release]
方法中调用dealloc
。
答案 1 :(得分:0)
我认为您应该在视图控制器的dealloc方法中释放字典,以便在释放ViewController时减少数据源的保留计数。
使用后保留而不释放是内存泄漏的主要来源。
答案 2 :(得分:0)
看来是对的。 唯一令我困惑的是tableData。这个var也是在其他地方发布或分配的吗?
假设您确实将其分配到其他地方,而不是在dealloc中释放它,那么这些步骤不应该是:
看起来像是一个远景,但是。你能展示乐器说的吗?