2013-05-24 2 views
0

Инструмент показывает утечку памяти в следующем коде. Я убедился, что повсеместно сохраняется счет. Я также добавил пул авторесурсов, все еще есть утечка памяти. Как это решить?Как решить проблему утечки памяти в функции SKDatabase?

Код блока:

- (NSArray *)lookupAllForSQL:(NSString *)sql 
{ 
    sqlite3_stmt *statement; 
    id result = nil; 
    NSMutableArray *thisArray = [NSMutableArray arrayWithCapacity:4]; 
    statement = [self prepare:sql]; 
    if (statement) 
    { 
     while (sqlite3_step(statement) == SQLITE_ROW) 
     { 
      NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

      NSMutableDictionary *thisDict = [NSMutableDictionary dictionaryWithCapacity:4]; 
      for (int i = 0 ; i < sqlite3_column_count(statement) ; i++) 
      { 
       NSAutoreleasePool *poolInside = [[NSAutoreleasePool alloc] init]; 
       if(sqlite3_column_type(statement,i) == SQLITE_NULL) 
       { 
        continue; 
       } 
       if (sqlite3_column_decltype(statement,i) != NULL && 
        strcasecmp(sqlite3_column_decltype(statement,i),"Boolean") == 0) 
       { 
        result = [NSNumber numberWithBool:(BOOL)sqlite3_column_int(statement,i)]; 
       } 
       else if (sqlite3_column_type(statement,i) == SQLITE_INTEGER) 
       { 
        result = [NSNumber numberWithInt:(int)sqlite3_column_int(statement,i)]; 
       } 
       else if (sqlite3_column_type(statement,i) == SQLITE_FLOAT) 
       { 
        result = [NSNumber numberWithFloat:(float)sqlite3_column_double(statement,i)]; 
       } 
       else 
       { 
        if((char *)sqlite3_column_text(statement,i) != NULL) 
        { 
         //result = [NSString stringWithUTF8String:(char *)sqlite3_column_text(statement,i)]; 
         [thisDict setObject:[NSString stringWithUTF8String:(char *)sqlite3_column_text(statement,i)] 
            forKey:[NSString stringWithUTF8String:sqlite3_column_name(statement,i)]]; 
         //[result release]; 
         result = nil; 
        } 
       } 
       if (result) 
       { 
        [thisDict setObject:result forKey:[NSString stringWithUTF8String:sqlite3_column_name(statement,i)]]; 
       } 
       [poolInside drain]; 
      } 
      [thisArray addObject:[NSDictionary dictionaryWithDictionary:thisDict]]; 
      [pool drain]; 
     } 
    } 
    sqlite3_finalize(statement); 
    return thisArray; 
} 

Инструмент Скриншот:

enter image description here

+1

Иногда SQLite будет проскальзывать и возвращать строку, которую вы должны использовать 'free()' самостоятельно. Посмотрите, если это проблема. – CodaFi

+0

@CodaFi Кажется, вы были правы. Возвращаемая переменная должна обрабатываться корректно, а не переменная внутри этой функции. Thanku –

+0

Возможно, вы захотите бросить проблему на репо этого парня. – CodaFi

ответ

0

У меня есть решение. Эта функция возвращала NSArray, который я не выпускал должным образом. Таким образом, все эти переменные вызывали утечку памяти, а не эту функцию.

This video помог мне понять это.

0

Я думаю, что continue заявление может быть проблемой. Поскольку оператор continue приводит к тому, что управление переходит к следующему вступлению ближайшего цикла, если условие (sqlite3_column_type(statement,i) == SQLITE_NULL) равно true, управление переходит к следующей итерации, а пул poolInside не будет слит. Поэтому я хотел бы использовать:

if(sqlite3_column_type(statement,i) == SQLITE_NULL) 
{ 
    [poolInside drain]; 
    continue; 
} 

Однако, это может быть ошибка, которую вы добавили пытается решить утечку, поэтому комментарий от @CodaFi остается в силе.

Для полноты

Если вы посмотрите на последствия утечки poolInside, вы можете увидеть, что эта строка:

[thisArray addObject:[NSDictionary dictionaryWithDictionary:thisDict]]; 

будет протекать в NSDictionary с каждым poolInside протечь. Таким образом, это означает, что возвращенный массив будет содержать просочившиеся объекты. Кроме того, я подозреваю, что утечка вложенного NSAutoreleasePool может привести к утечке объектов, созданных внутри цикла for. Я думаю, что опубликованный вами «Скриншот инструментов» показывает это поведение.

Смежные вопросы