开发者

NSString with NSmutablearray Memory leaks

When I run with Instrument the below code gets memory leaking.

Here I have declared all NSMutablearrays are as properties.

I have made comments here where exactly memory is leaking.

-(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 (s开发者_如何转开发qlite3_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_close(database);
}
sqlite3_finalize(statement);
}

Thanks.


You are closing the database before you finalize your statement. This means that the resources returned by your statement are not properly freed. Here is what the documentation has to say about sqlite3_close.

Applications must finalize all prepared statements and close all BLOB handles associated with the sqlite3 object prior to attempting to close the object. If sqlite3_close() is called on a database connection that still has outstanding prepared statements or BLOB handles, then it returns SQLITE_BUSY.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜