2011-07-14 10 views
0

以下のコードでメモリリークが発生しています。メモリリークSqliteからデータを取得中

これはメモリを処理する適切な方法ですか?

私を修正してください。

限り、私はあなたがオブジェクトを削除し、配列からそれで行われたときにことを確認してください(1によって保持カウントを増加させる)リークアレイにあるためのaddObjectで起こります。コードから言うことができるように
-(void)getholidays 
{ 
    if (idarray!=nil) { 
    [idarray release]; 
    idarray=nil; 
    } 
idarray=[[NSMutableArray alloc]init]; 

    if (Countryarray!=nil) { 
    [Countryarray release]; 
    Countryarray=nil; 
    } 
    Countryarray =[[NSMutableArray alloc] init]; 
    if (Holidaynamearray!=nil) { 
    [Holidaynamearray release]; 
    Holidaynamearray=nil; 
    } 
    Holidaynamearray =[[NSMutableArray alloc] init]; 
    if (Datearray!=nil) { 
    [Datearray release]; 
    Datearray=nil; 
    }Datearray =[[NSMutableArray alloc] init]; 
    if (Dayarray!=nil) { 
    [Dayarray release]; 
    Dayarray=nil; 
    }Dayarray =[[NSMutableArray alloc] init]; 
    if (Favoritearray!=nil) { 
    [Favoritearray release]; 
    Favoritearray=nil; 
    } 

    Favoritearray =[[NSMutableArray alloc] init]; 

    NSString *destinationPath = [self getdestinationPath]; 

    const char *dbpath = [destinationPath UTF8String]; 
    sqlite3_stmt *statement; 

    if (sqlite3_open(dbpath, &database) == SQLITE_OK) 

    { 
    NSString *querySQL; 


    NSDate *today = [NSDate date]; 
    NSDateFormatter* formatter = [[[NSDateFormatter alloc] init] autorelease]; 
    [formatter setDateFormat:@"MMMM-dd-yyyy"]; 
    NSString *Todaystrng = [formatter stringFromDate:today]; 

    NSLog(@"today date %@",Todaystrng); 

    querySQL=[NSString stringWithFormat:@"SELECT * FROM Holiday_Table WHERE CountryName in (SELECT Country_Name from Country WHERE Country_Selected =1) ORDER BY Date ASC "]; 



    const char *query_stmt = [querySQL UTF8String]; 

    if (sqlite3_prepare_v2(database, query_stmt, -1, &statement, NULL) == SQLITE_OK) 
    { 
     NSLog(@"success"); 
     while (sqlite3_step(statement) == SQLITE_ROW) 
     { 

      NSString *idstringfromdb=[[NSString alloc] initWithUTF8String:(const char *) sqlite3_column_text(statement, 0)]; 
      NSString *countrynamestringfromdb=[[NSString alloc] initWithUTF8String:(const char *) sqlite3_column_text(statement, 1)]; 
      NSString *holidaynamestringfromdb=[[NSString alloc] initWithUTF8String:(const char *) sqlite3_column_text(statement, 2)]; 
      NSString *datestringfromdb=[[NSString alloc] initWithUTF8String:(const char *) sqlite3_column_text(statement, 3)]; 

      //Below line gets leaking 
       NSString *daystringfromdb=[[NSString alloc] initWithUTF8String:(const char *) sqlite3_column_text(statement, 4)]; 
        //Belowline gets leaking 
      NSString *favoritestringfromdb=[[NSString alloc] initWithUTF8String:(const char *) sqlite3_column_text(statement, 5)]; 


      [idarray addObject:idstringfromdb]; 
      [idstringfromdb release]; 
      idstringfromdb=nil; 
      [Countryarray addObject:countrynamestringfromdb]; 
      [countrynamestringfromdb release]; 
      countrynamestringfromdb=nil; 
      [Holidaynamearray addObject:holidaynamestringfromdb]; 
      [holidaynamestringfromdb release]; 
      holidaynamestringfromdb=nil; 
      [Datearray addObject:datestringfromdb]; 
      [datestringfromdb release]; 
      datestringfromdb=nil; 

      [Dayarray addObject:daystringfromdb]; 
      [daystringfromdb release]; 
      daystringfromdb=nil; 

      [Favoritearray addObject:favoritestringfromdb]; 
      [favoritestringfromdb release]; 
      favoritestringfromdb=nil; 
     } 
    } 
    sqlite3_finalize(statement); 
} 
sqlite3_close(database); 
} 
+0

私はこれを答えにしませんが、Instrumentsを使用して、どこにメモリが漏れているかをほぼ正確に教えてくれます。 –

+0

私は楽器の助けを借りてIamの漏れがどこにあるのかを知るようになりました。私はそれらの行についてコメントしました。私のコードを確認してください。 –

+0

私は間違っていないか、または自動解放に設定すると、addObjectは保持カウントを1増加させると思います。保持する前と後にretainCountを確認できることを覚えていません。(私のMacを持っていません) –

答えて

0

あなたはそこにもリリースします。

+0

私はどこで解放しなければならないのですか? –

+0

オブジェクトを配列に追加すると、オブジェクトが配列から削除されると、配列の使用が終了したら解放する必要があります。 –

関連する問題