从Sqlite获取数据时内存泄漏

从Sqlite获取数据时内存泄漏,sqlite,nsstring,Sqlite,Nsstring,我在下面的代码中发现内存泄漏 这是处理内存的正确方法吗 请纠正我 -(void)getholidays { if (idarray!=nil) { [idarray release]; idarray=nil; } idarray=[[NSMutableArray alloc]init]; if (Countryarray!=nil) { [Countryarray release]; Countryarray=nil; }

我在下面的代码中发现内存泄漏

这是处理内存的正确方法吗

请纠正我

-(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);
}

据我所知,从您的代码中可以看出,泄漏的发生是由于数组中的addObject(它将retain计数增加了一个)确保当您从阵列中移除对象并完成处理后,您也会将其释放到阵列中。

我不会将此作为答案,而是使用仪器,它会告诉您几乎准确的内存泄漏位置。是的,在仪器的帮助下,我知道了Iam泄漏的位置,并对这些行进行了评论。请检查我的代码。如果我没有弄错的话,我认为addObject会将retain count增加1,或者将其设置为autorelease。我不记得在添加之前和之后,您可以检查哪个retainCount,以查看(不带mac)我应该在哪里释放?您正在将对象添加到数组中,一旦对象从阵列中移除,您必须在使用完毕后释放它。