我的函数是get All Data,它返回一个带有dictonaries的数组。
- (NSArray *)getAllData {
NSMutableArray *result = [[NSMutableArray alloc] init];
NSArray *data = [skiResorts sortedArrayUsingFunction:comparator context:NULL];
NSString *currentLetter = @"A";
NSMutableArray *array = [[NSMutableArray alloc] init] ;
NSMutableDictionary *dict = [[NSMutableDictionary alloc] init] ;
if ([data count] > 0) {
for (SkiResort *resort in data) {
if ([resort.name hasPrefix:currentLetter]) {
// Same letter as before.
// Add current SkiResort to temporary array.
[array addObject:resort];
} else {
// New letter.
// Add previous header/row data to dictionary.
[dict setValue:currentLetter forKey:@"header"];
[dict setValue:array forKey:@"row"];
// Add dictionary to final result array.
[result addObject:dict];
// Startover ...
[array removeAllObjects];
[dict removeAllObjects];
// Prepare for next letter.
currentLetter = [resort.name substringToIndex:1];
// Add current SkiResort to temporary array.
[array addObject:resort];
}
}
// Add previous header/row data to dictionary.
[dict setValue:currentLetter forKey:@"header"];
[dict setValue:array forKey:@"row"];
// Add dictionary to final result array.
[result addObject:dict];
}
[array release];
[dict release];
return [result autorelease];
}
我的代码中是否有人可以看到明显的内存泄漏?我得到内存泄漏数组,字典和结果......
答案 0 :(得分:1)
从代码中,我不得不问:你知道addObject:不复制对象吗?所以设置值为dict,然后将其添加到结果中,然后从dict中删除所有内容只会在结果中留下一个空字典?我想你可能想在那里使用'copy'方法来制作数组和字典的副本。或者,更好的是,只需使用其中一种类方法将字典添加到结果中即可创建字典。
无论如何,由于我看不到任何泄漏,更有可能的是接收到getAllData结果的人随后泄漏了它。如果出于某种疯狂的原因,你有一个偏离的地方:
[[object getAllData] retain];
然后泄漏工具会识别数组,字典和结果的泄漏,并指向getAllData作为最初创建它们的方法。
答案 1 :(得分:0)
在我回答我的知识之前,我真的应该说非常有限,所以考虑到这一点。但在我看来,就像你在容器内有一个容器。当你为此保留记忆时,你必须向后保留记忆。
例如,容器A中的存储n(B_Containers)保留n_B个容器和1个容器。要取消内存,您需要首先取消保存n B_Containers,然后再删除A或所有B_Containers将在您的内存中引用并浮动。