Простой вопрос управления памятью в Objective-C - PullRequest
0 голосов
/ 06 сентября 2010

В моей программе есть утечка памяти и потому что я не очень хорошо разбираюсь в C (создал функцию в моем классе Objective C для загрузки строк из базы данных SQLite)Кто-нибудь может заметить мою ошибку?Спасибо:

static int MyCallback(void *context, int lCount, char **values, char **columns){

NSMutableArray *sqlRawStrings = (NSMutableArray *)context;
for (int i = 0; i < lCount; i++) {
    const char *nameCString = values[i];
    if (nameCString != NULL) {
        [sqlRawStrings addObject:[NSString stringWithUTF8String:nameCString]];
    }
} 

return SQLITE_OK;

}

Все это здесь раньше вызывается:

int numberA = [loadBundleNumber intValue];
char str1[130] = "select ";
for(int i = 7; i <7 + numberA; i++){
    str1[i] = 'a';
}
char str2[20] = " from puzzles";
strcat(str1,str2);

NSString *file = [[NSBundle mainBundle] pathForResource:@"finalPuzzles" ofType:@"db"];
sqlite3 *database = NULL;
if (sqlite3_open([file UTF8String],&database) == SQLITE_OK) {
    sqlite3_exec(database, str1, MyCallback, sqlRawStrings, NULL);
}
sqlite3_close(database);

Спасибо

Ответы [ 2 ]

0 голосов
/ 06 сентября 2010

Лучше всего предположить, что sqlRawStrings никогда не выпускается, и поэтому ничего не добавляется к нему.

0 голосов
/ 06 сентября 2010

Больше комментариев, чем ответов, так как я пока не вижу, как у вас течет память (пока недостаточно комментариев).Как вы наблюдаете, что есть утечка памяти?Можете ли вы увидеть, что находится внутри объекта, который просочился, и проследить его трассировку стека выделения, чтобы увидеть, что это такое?

Также вы можете предоставить объявление для sqlRawStrings?

В качестве отступления,Я думаю, что способ, которым вы строите свои строки, может быть улучшен.Рассмотрите возможность использования sprintf.Вы также можете рассмотреть возможность использования файла .mm вместо .m, и тогда вы получите возможность C ++;класс std :: string может вам помочь.

Наконец, не закрывайте что-либо, если вы не открыли его успешно, т.е. "sqlite3_close" должен находиться в том же блоке, что и sqlite3_exec.

'надеюсь, что это полезно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...