Sqlite аварийное приложение - PullRequest
       2

Sqlite аварийное приложение

1 голос
/ 10 января 2012

Я использую этот код для вставки имен в таблицу, у меня проблема с тем, что после 150 +/- имена приложение вылетает с этим журналом:

 Received memory warning. Level=1
 Received memory warning. Level=2

это код, я сделал что-то не так?

if (sqlite3_open([dataPath UTF8String], &database) == SQLITE_OK) {
    for (int i = 0 ; i < count; i++) {          
        sqlite3_stmt *insertStmt = nil;
        NSString *name = [song valueForProperty:MPMediaItemPropertyTitle];

        if(insertStmt == nil) 
        {
            NSString *statement = [NSString stringWithFormat:@"INSERT INTO Songs (name) VALUES (?)"];
            const char *insertSql = [statement UTF8String];

            if(sqlite3_prepare_v2(database, insertSql, -1, &insertStmt, NULL) != SQLITE_OK){
                NSLog(@"Error while creating insert statement.");
                insertStmt = nil;
                continue;
            }

            sqlite3_bind_text(insertStmt, 1, [name UTF8String], -1, SQLITE_TRANSIENT);


            if(SQLITE_DONE != sqlite3_step(insertStmt)){
                NSLog(@"Error while inserting data.");
                insertStmt = nil;
                continue;
            }
            else{}

            sqlite3_reset(insertStmt);
            insertStmt = nil;
        }

        [delegate IPodLibraryFinishEntity:self];
    }

    sqlite3_close(database);

}

Ответы [ 3 ]

1 голос
/ 10 января 2012

Используйте инструменты для проверки потери памяти из-за оставшейся, но не утечки памяти. Последний является неиспользованной памятью, на которую все еще указывают. Используйте Heapshot в инструменте Allocations на инструментах.

Чтобы узнать, как использовать Heapshot для поиска утечки памяти, см. bbum blog

По существу, существует метод запуска инструмента выделения инструментов, создания кучи, выполнения интуитивного кода и повторения кучи еще 3 или 4 раза. Это будет указывать на память, которая выделяется и не освобождается во время итераций.

Чтобы выяснить результаты раскрыть, чтобы увидеть отдельные распределения.

Если вам нужно увидеть, где хранятся, деблокируются и автоматически выпускаются инструменты, использующие объект:

Запустить на инструментах, в Allocations включить «Record reference counts» on (вы должны остановить запись, чтобы установить опцию). Заставьте сборщик запустить, остановить запись, найти там ivar (datePickerView), выполнить детализацию, и вы сможете увидеть, где произошли все сохранения, выпуски и автоматические выпуски.

0 голосов
/ 10 января 2012

Ваш код не является оптимальным.Вы должны поместить все методы подготовки перед циклом.

if (sqlite3_open([dataPath UTF8String], &database) == SQLITE_OK) {

    sqlite3_stmt *insertStmt = nil;
    NSString *name = [song valueForProperty:MPMediaItemPropertyTitle];

    if(insertStmt == nil) {
        NSString *statement = [NSString stringWithFormat:@"INSERT INTO Songs (name) VALUES (?)"];
        const char *insertSql = [statement UTF8String];

        if(sqlite3_prepare_v2(database, insertSql, -1, &insertStmt, NULL) != SQLITE_OK){
            NSLog(@"Error while creating insert statement.");
            insertStmt = nil;
            return;
        }
    }
    for (int i = 0 ; i < count; i++) {          
        sqlite3_bind_text(insertStmt, 1, [name UTF8String], -1, SQLITE_TRANSIENT);

        if(SQLITE_DONE != sqlite3_step(insertStmt)){
            NSLog(@"Error while inserting data.");
            continue;
        }
        else{}

        sqlite3_clear_bindings(insertStmt); //release bindings
        sqlite3_reset(insertStmt);

        [delegate IPodLibraryFinishEntity:self];
    }
    sqlite3_close(database);
}
0 голосов
/ 10 января 2012

Перед началом каждого оператора вставки используйте sqlite3_open , а после выполнения запроса поместите оператор sqlite3_close . Так что он не будет больше загружать объект базы данных после каждого выполнения запроса вставки.

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