mercredi 26 août 2015

Objective C - sqlite3_open Memory leak even though sqlite3_close() applied

I am getting memory leaks at sqlite3_open even though sqlite_close, sqlite3_finalize are applied, please guide me where I am going wrong. Project is in Non - ARC.

     -(BOOL)saveMedia:(NSDictionary *)details Download:(NSInteger)completed
{
    //NSLog(@"media savemedia %@",[details objectForKey:@"type"]);
    BOOL saved = FALSE;
    NSInteger exists = [self findMedia:[details objectForKey:@"media_id"] playlist_id:[details objectForKey:@"playlist_id"] type:[details objectForKey:@"type"]];
    sqlite3_stmt    *statement;

    self.databasePath = [self getDBPath];
    const char *dbpath = [databasePath UTF8String];
    if (sqlite3_open(dbpath, &wazzupco) == SQLITE_OK)
    {
        const char *query_stmt;
        if (exists == 0)
        {
            query_stmt = "INSERT INTO media (media_id, title, description, file, views, thumbnail, version, playlist, playlist_id, author, created_at, type, playlist_created, timeout, playlist_order, media_order, playlist_promo_text, playlist_promo_url, playlist_promo_img,video_promo_text, video_promo_url, video_promo_img, dev_id, device_id, downloaded,slide_timeout) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
        }
        else if([[details objectForKey:@"version"] integerValue] > exists)
        {
            NSString *querySQL = [NSString stringWithFormat:@"UPDATE %@ SET media_id=?, title=?, description=?, file=?, views=?, thumbnail=?, version=?, playlist=?, playlist_id=?, author=?, created_at=?, type=?, playlist_created=?, timeout=?, playlist_order=?, media_order=?, playlist_promo_text=?, playlist_promo_url=?, playlist_promo_img=?,video_promo_text=?, video_promo_url=?, video_promo_img=?, dev_id=?, device_id=?, downloaded=?, slide_timeout=? WHERE media_id='%@' AND playlist_id='%@' AND type='%@'", TABLE_MEDIA, [details objectForKey:@"media_id"], [details objectForKey:@"playlist_id"], [details objectForKey:@"type"]];
            query_stmt = [querySQL UTF8String];
        }
        else
        {
            //to make sure we won't update the database entry unless its a newer version
            return FALSE;
        }
        sqlite3_prepare_v2(wazzupco, query_stmt, -1, &statement, NULL);

        sqlite3_bind_text(statement, 1, [[details objectForKey:@"media_id"] UTF8String], -1, NULL);
        sqlite3_bind_text(statement, 2, [[details objectForKey:@"title"] UTF8String], -1, NULL);
        sqlite3_bind_text(statement, 3, [[details objectForKey:@"description"] UTF8String], -1, NULL);
        sqlite3_bind_text(statement, 4, [[details objectForKey:@"file"] UTF8String], -1, NULL);
        sqlite3_bind_text(statement, 5, [[details objectForKey:@"views"] UTF8String], -1, NULL);
        sqlite3_bind_text(statement, 6, [[details objectForKey:@"thumbnail"] UTF8String], -1, NULL);
        sqlite3_bind_text(statement, 7, [[details objectForKey:@"version"] UTF8String], -1, NULL);
        sqlite3_bind_text(statement, 8, [[details objectForKey:@"playlist"] UTF8String], -1, NULL);
        sqlite3_bind_text(statement, 9, [[details objectForKey:@"playlist_id"] UTF8String], -1, NULL);
        sqlite3_bind_text(statement, 10, [[details objectForKey:@"author"] UTF8String], -1, NULL);
        sqlite3_bind_text(statement, 11, [[details objectForKey:@"created_at"] UTF8String], -1, NULL);
        sqlite3_bind_text(statement, 12, [[details objectForKey:@"type"] UTF8String], -1, NULL);
        sqlite3_bind_text(statement, 13, [[details objectForKey:@"playlist_created"] UTF8String], -1, NULL);
        sqlite3_bind_text(statement, 14, [[details objectForKey:@"timeout"] UTF8String], -1, NULL);
        sqlite3_bind_int(statement, 15, [[details objectForKey:@"playlist_order"] intValue]);
        sqlite3_bind_int(statement, 16, [[details objectForKey:@"media_order"] intValue]);
        sqlite3_bind_text(statement, 17, [[details objectForKey:@"playlist_promo_text"] UTF8String], -1, NULL);
        sqlite3_bind_text(statement, 18, [[details objectForKey:@"playlist_promo_url"] UTF8String], -1, NULL);
        sqlite3_bind_text(statement, 19, [[details objectForKey:@"playlist_promo_img"] UTF8String], -1, NULL);
        sqlite3_bind_text(statement, 20, [[details objectForKey:@"video_promo_text"] UTF8String], -1, NULL);
        sqlite3_bind_text(statement, 21, [[details objectForKey:@"video_promo_url"] UTF8String], -1, NULL);
        sqlite3_bind_text(statement, 22, [[details objectForKey:@"video_promo_img"] UTF8String], -1, NULL);
        sqlite3_bind_int(statement, 23, [[details objectForKey:@"dev_id"] intValue]);
        sqlite3_bind_text(statement, 24, [[details objectForKey:@"device_id"] UTF8String], -1, NULL);
        sqlite3_bind_int(statement, 25, (int)completed);
        sqlite3_bind_text(statement, 26, [[details objectForKey:@"slide_timeout"] UTF8String], -1, NULL);        
        if (sqlite3_step(statement) == SQLITE_DONE)
        {
            NSLog(@"media added. type:%@",[details objectForKey:@"type"]);
            saved = TRUE;
        }
        sqlite3_finalize(statement);
        //sqlite3_free(statement);
        //sqlite3_reset(statement);
    }
    sqlite3_close(wazzupco);
    if (completed != 0 && saved)
    {
        [self updateMediaStatus:[details objectForKey:@"file"] Download:1];
    }

    return saved;
}

In the above code I am inserting or updating data from a NSdictionary to sqlite table by considering if the data already exists or not. The method executes fine but it produce serious of memory leaks (the method is called multiple times from a loop), when checked in Instrument it is showing the leak is at if (sqlite3_open(dbpath, &wazzupco) == SQLITE_OK).

From Instrument

Leaked Object: Malloc 64Bytes

18

Address Size: 1.12KB Responsible Library: libsqlite3.dylib Responsible Frame: 0x34bdce30

Aucun commentaire:

Enregistrer un commentaire