私は定期的なトランザクションがデータベースに挿入されている1つのアプリケーションを開発しています。私はヒープショット分析を行っていますが、データを挿入している間にメモリ不足の警告を表示しています。約1200レコードを挿入しています。ヒープショット解析中にアプリケーションのメモリー不足警告が表示されるのはなぜですか?
-(void)generateReccuringEntry:(int)tranId withAllDate:(BOOL)isAll
{
NSMutableArray *arrDates = [[NSMutableArray alloc] init] ;
NSArray *arr = [[_dicSaveData valueForKey:@"tran_repeatd"] componentsSeparatedByString:@" "];
int day;
if ([self getDayWithDayMonth:[arr objectAtIndex:1]] == 0) {
day = [self getDay:[arr objectAtIndex:1]];
}
else{
day = 1;
}
NSDate *startDate = [_dicSaveData valueForKey:@"tran_date"];
NSString *strEndDate = [NSString stringWithFormat:@"%@",[_dicSaveData valueForKey:@"tran_enddate"]];
NSDate *endDate = nil;
strEndDate = [strEndDate stringByReplacingOccurrencesOfString:@"(null)" withString:@""];
if (![strEndDate stringIsEmpty]) {
endDate = [_dicSaveData valueForKey:@"tran_enddate"];
}
else {
//if end date not selected
endDate = [[startDate dateByAddingYear:1]lastOfYearDate];
}
//get start recurring day
NSString *strDay = [[arr lastObject] stringByReplacingOccurrencesOfString:@"()" withString:@""];
//check start recuring day selected or not
if ([strDay hasPrefix:@"("] && [strDay hasSuffix:@")"])
{
startDate = [self getStartDay:[arr lastObject] withStartingDate:startDate];
if ([startDate compare:endDate]==NSOrderedDescending || [startDate compare:endDate]==NSOrderedSame)
{
SafeRelease(arrDates);
return;
}
if (isAll)
{
NSError *error = nil;
NSString *strQuery = [NSString stringWithFormat:@"insert into recuring values (NULL,%i,%@,%@,'%@',%@,'%@','','%@','%@',%i,1,'%@',0)",tranId,[_dicSaveData valueForKey:@"cat_id"],[_dicSaveData valueForKey:@"subcat_id"],_txtDesc.text,_txtAmount.text,sDate,[_dicSaveData valueForKey:@"tran_repeatd"],eDate,_flagForever,[_dicSaveData valueForKey:@"categoryText"]];
strQuery = [strQuery stringByReplacingOccurrencesOfString:@"(null)" withString:@""];
[NSNumber requestWithSynchronousExcuteQuery:strQuery withReturnningError:&error];
if (error) {
[AppDelegate showAlert:[error description] withTitle:@"Error!"];
}
}
else{
NSDate *currentDate = [[NSDate date] getDateWithDeviceTimeZone];
if ([startDate compare:currentDate]== NSOrderedDescending)
{
NSError *error = nil;
NSString *strQuery = [NSString stringWithFormat:@"insert into recuring values (NULL,%i,%@,%@,'%@',%@,'%@','','%@','%@',%i,1,'%@',0)",tranId,[_dicSaveData valueForKey:@"cat_id"],[_dicSaveData valueForKey:@"subcat_id"],_txtDesc.text,_txtAmount.text,sDate,[_dicSaveData valueForKey:@"tran_repeatd"],eDate,_flagForever,[_dicSaveData valueForKey:@"categoryText"]];
strQuery = [strQuery stringByReplacingOccurrencesOfString:@"(null)" withString:@""];
[NSNumber requestWithSynchronousExcuteQuery:strQuery withReturnningError:&error];
if (error) {
[AppDelegate showAlert:[error description] withTitle:@"Error!"];
}
}
}
}
int index = 2;
if (day == 1) {
index = 1;
}
do {
if ([[arr objectAtIndex:index] isEqualToString:@"Week"])
{
startDate = [startDate dateByAddingWeek:day];
}
else if([[arr objectAtIndex:index] isEqualToString:@"Month"])
{
startDate = [startDate dateByAddingMonth:day];
}
else
{
startDate = [startDate dateByAddingDays:day];
}
if (isAll)
{
NSError *error = nil;
NSString *strQuery = [NSString stringWithFormat:@"insert into recuring values (NULL,%i,%@,%@,'%@',%@,'%@','','%@','%@',%i,1,'%@',0)",tranId,[_dicSaveData valueForKey:@"cat_id"],[_dicSaveData valueForKey:@"subcat_id"],_txtDesc.text,_txtAmount.text,sDate,[_dicSaveData valueForKey:@"tran_repeatd"],eDate,_flagForever,[_dicSaveData valueForKey:@"categoryText"]];
strQuery = [strQuery stringByReplacingOccurrencesOfString:@"(null)" withString:@""];
[NSNumber requestWithSynchronousExcuteQuery:strQuery withReturnningError:&error];
if (error) {
[AppDelegate showAlert:[error description] withTitle:@"Error!"];
}
}
//add recuring for only for future dates
else
{
NSDate *currentDate = [[NSDate date] getDateWithDeviceTimeZone];
if ([startDate compare:currentDate]== NSOrderedDescending)
{
NSError *error = nil;
NSString *strQuery = [NSString stringWithFormat:@"insert into recuring values (NULL,%i,%@,%@,'%@',%@,'%@','','%@','%@',%i,1,'%@',0)",tranId,[_dicSaveData valueForKey:@"cat_id"],[_dicSaveData valueForKey:@"subcat_id"],_txtDesc.text,_txtAmount.text,sDate,[_dicSaveData valueForKey:@"tran_repeatd"],eDate,_flagForever,[_dicSaveData valueForKey:@"categoryText"]];
strQuery = [strQuery stringByReplacingOccurrencesOfString:@"(null)" withString:@""];
[NSNumber requestWithSynchronousExcuteQuery:strQuery withReturnningError:&error];
if (error) {
[AppDelegate showAlert:[error description] withTitle:@"Error!"];
}
}
}
} while ([startDate compare:endDate]==NSOrderedAscending);
SafeRelease(arrDates);
}
can anyone tell that what is the problem with this code.so that its consuming so much memory?
アップデート:私はアプリケーションをARCに変換しましたが、まだメモリ警告が表示されています。
このコードでは、自動リリースされたオブジェクトが多すぎます。 whileループ内に一時的な自動解放プールを作成し、毎回自動解放して、自動解放されたオブジェクトが占有するメモリを使用できるようにすることができます。しかし、あなたがアプリケーションの他の部分で後で使用するautoreleasedオブジェクトを保持することを確認してください。そうしないと、プールが排水され、その他の問題が発生すると解放されます。正確なメモリフットプリントを知るには、アプリケーションをAllocations計測器で実行する必要があります。どのくらいのメモリが使用されているかを知ることができます。 – Ravin
最初にコーディングガイドラインをお読みください!そして、記憶について尋ねる。 –
ここにはオブジェクトはありませんautoreleased.safereleseは#defineとしてprefix.pchで定義されていますSafeRelease(var_name)if(var_name!= nil)[var_name release]; var_name = nil;ヒープ・ショット分析は、アプリケーション内で割り当てを実行して実行されます。 – Bhoomi