在我的应用程序中,我在NSMutableArray,NSArray和NSString中得到了内存泄漏。iPhone SDK中的NSMutableArray,NSArray,NSString中的内存泄漏
这是代码。
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)for second for loop。
而subArray和langArray是我的全局数组。
如果我从NSArray *newArray =[[[self returnExecuteQuery:columnQuery] mutableCopy] autorelease];
和NSArray *subArray1 = [[[self returnExecuteQuery:subQuery] mutableCopy] autorelease];
删除mutableCopy
,则subArray和langArray不会保留值。
如何避免此代码中的内存泄漏?
是什么'-returnExecuteQuery:'怎么办?它是返回一个拥有的还是非拥有的对象?其合同是否会说明多次调用的返回值有效性? – 2011-04-16 11:12:20
你释放tempArray吗?哪里?此外,尝试在addObjectsFromArray之后释放subArray1和newArray(而不是自动释放它们)。 – Sefran2 2011-04-16 12:05:26
@Fran:我试图在main for循环之后释放两个数组,但它给了我subECray和langArray的EXEC_BAD_ACCESS错误。 – Meghan 2011-04-16 12:43:08