В моем приложении у меня возникли утечки памяти в NSMutableArray, NSArray и NSString.Утечка памяти в NSMutableArray, NSArray, NSString в iPhone SDK
Вот код.
NSString *subQuery = [NSString stringWithFormat:@"SELECT %@ FROM tbl_lang WHERE glossary = '%@'",append1,glossaryName];
NSArray *subArray1 = [[[self returnExecuteQuery:subQuery] mutableCopy] autorelease];
[subArray addObjectsFromArray:subArray1];
NSString *columnQuery = [NSString stringWithFormat:@"select AutoID,%@ from tbl_lang where glossary='%@'",lblshortName.text,glossaryName];
NSArray *newArray =[[[self returnExecuteQuery:columnQuery] mutableCopy] autorelease];
[langArray addObjectsFromArray:newArray];
NSMutableArray *tempArray = [[NSMutableArray alloc] init];
for (int i=0; i<[newArray count]; i++) {
NSString *cellText = [[newArray objectAtIndex:i] valueForKey:[NSString stringWithFormat:@"%@",lblshortName.text]];
if (cellText != (NSString *)[NSNull null] && ![cellText isEqualToString:@""]) {
NSString *decodedString3 = [NSString stringWithUTF8String:[cellText cStringUsingEncoding:[NSString defaultCStringEncoding]]];
[tempArray addObject:[NSString stringWithFormat:@"%@ : %@",lblshortName.text, decodedString3]];
}
else {
[tempArray addObject:@"<empty>"];
}
NSString *detail = @"_________________";
for (int j=0; j<[lableNameArray count]; j++) {
NSString *checkNull=[[subArray1 objectAtIndex:i] valueForKey:[NSString stringWithFormat:@"%@",[lableNameArray objectAtIndex:j]]];
if(checkNull != (NSString *)[NSNull null] && checkNull.length > 0)
{
NSString *decodedString4 = [NSString stringWithUTF8String:[checkNull cStringUsingEncoding:[NSString defaultCStringEncoding]]];
detail = [NSString stringWithFormat:@"%@\n%@ : %@ ",detail,[lableNameArray objectAtIndex:j],decodedString4];
}
}
[detailTextArray addObject:detail];
}
Когда я бегу инструменты я получил утечки в
-subArray1 во второй строке.
-detail (NSString) во втором цикле.
И subArray и langArray - мои глобальные массивы.
Если я удалю mutableCopy
от NSArray *newArray =[[[self returnExecuteQuery:columnQuery] mutableCopy] autorelease];
и NSArray *subArray1 = [[[self returnExecuteQuery:subQuery] mutableCopy] autorelease];
, то subArray и langArray не сохраняют значения.
Как избежать утечки памяти в этом коде?
Что '-returnExecuteQuery:' делать? Возвращает ли он принадлежащий или не принадлежащий ему объект? Подходит ли в его контракте что-либо о допустимости возвращаемого значения для нескольких вызовов? –
Вы выпускаете tempArray? где? Кроме того, попробуйте освободить subArray1 и newArray (вместо этого их авторекламу) после addObjectsFromArray. – Sefran2
@Fran: Я попытался освободить оба массива после основного цикла, но он дает мне ошибку EXEC_BAD_ACCESS для subArray и langArray. – Meghan