2012-02-29 6 views
0

私は定期的なトランザクションがデータベースに挿入されている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に変換しましたが、まだメモリ警告が表示されています。

+0

このコードでは、自動リリースされたオブジェクトが多すぎます。 whileループ内に一時的な自動解放プールを作成し、毎回自動解放して、自動解放されたオブジェクトが占有するメモリを使用できるようにすることができます。しかし、あなたがアプリケーションの他の部分で後で使用するautoreleasedオブジェクトを保持することを確認してください。そうしないと、プールが排水され、その他の問題が発生すると解放されます。正確なメモリフットプリントを知るには、アプリケーションをAllocations計測器で実行する必要があります。どのくらいのメモリが使用されているかを知ることができます。 – Ravin

+0

最初にコーディングガイドラインをお読みください!そして、記憶について尋ねる。 –

+0

ここにはオブジェクトはありませんautoreleased.safereleseは#defineとしてprefix.pchで定義されていますSafeRelease(var_name)if(var_name!= nil)[var_name release]; var_name = nil;ヒープ・ショット分析は、アプリケーション内で割り当てを実行して実行されます。 – Bhoomi

答えて

0

あなたができる場合は、ARCに変換することを強くお勧めします。コンパイラは、より効率的な保持/解放を挿入することができます。 SafeReleaseのようなものを必要とするものは完全に削除しますか?

+0

私はautoreleaseプールを追加しましたが、メモリ警告を表示しています。私はいくつかのライブラリを使用しているので、プロジェクトをARCに変換できません。 – Bhoomi

+0

もちろん、ARCに変換してARC以外のライブラリを使用することもできます。これらのライブラリを使用するクラスのチェックボックスをクリック解除するだけで(少なくとも理想的にはそれらを最小限のクラスに分解する)私はそれが実現可能ではないかもしれない、普及していることを認識します。しかし、主なポイントは(残念ですが)リリース/自動リリースのフルハンドルを持っていない可能性があります。あなたのオブジェクトはすでにオートレリースされています。もう1つを追加すると助けにはなりません。オブジェクトを非オートレリースに変換するには、 '[NSString stringWithFormat:..]'を '[[NSString alloc] initWithFormat:...]'に変更してから、後でリリースを追加する必要があります。 –

+0

私はそれをARCに変換しました。しかし、それでもメモリ警告が表示されます。 – Bhoomi

関連する問題