NSDictionary泄漏问题

时间:2010-11-09 19:52:15

标签: objective-c iphone-sdk-3.0 ipad

我的应用在设备上运行时发生泄漏。 泄漏位于以下代码段中:

+ (NSMutableDictionary *)newDict:(int)index {
 NSLog(@"%@: %s: %i", [self description],__FUNCTION__, index);
 NSString *themePath;
 NSDictionary *themesDict;
 NSMutableArray *themesArray;
 NSMutableDictionary *thisThemeDict;
 if (index < 4) {
  themePath = [[NSBundle mainBundle] pathForResource:PATH_THEMES_PLIST ofType:@"plist"];
  themesDict = [NSDictionary dictionaryWithContentsOfFile:themePath];
  themesArray = [[themesDict objectForKey:KEY_THEMES] mutableCopy];
  thisThemeDict = [[themesArray objectAtIndex:index] mutableCopy];
 } else {
  themePath = [[NSBundle mainBundle] pathForResource:PATH_CHARTS_PLIST ofType:@"plist"];
  themesDict = [NSDictionary dictionaryWithContentsOfFile:themePath];
  themesArray = [[themesDict objectForKey:KEY_THEMES] mutableCopy];  
  thisThemeDict = [[themesArray objectAtIndex:0] mutableCopy];
 }
 themePath = nil;
 themesDict = nil;
 [themesArray release];
 return thisThemeDict;
}

泄漏仪器强调了这一行:

themesDict = [NSDictionary dictionaryWithContentsOfFile:themePath];

泄露的对象是NSCFString,所以我认为问题出在'themePath'上。

我尝试了几个小时和几个小时的解决方案......但没有运气。 任何人都可以帮助我......

谢谢xnz

2 个答案:

答案 0 :(得分:0)

您可以使用llvm编译器(在xcode 3.1.2及更高版本中构建和分析雪豹)来专门定位错误。如果您使用Leopard(10.5),泄漏仪器会偶尔报告不存在的内存泄漏。我的一个项目遇到了同样的问题。 Snow Leopard中的新泄漏仪器就好100%了。

LLVM compiler

答案 1 :(得分:0)

您向我们展示的代码在保留计数管理方面是正确的。可能被泄露的一件事是thisThemeDict,你从这个方法返回+1保留计数。这意味着无论何时调用此方法,您都需要释放它在某个时刻返回的对象。您应该检查如何处理此方法在代码库中调用它的每个位置返回的对象。