ios – Objective C – sqlite3_open即使应用了sqlite3_close(),内存也会泄漏

ios – Objective C – sqlite3_open即使应用了sqlite3_close(),内存也会泄漏,第1张

概述即使应用sqlite_close,sqlite3_finalize,我也会在sqlite3_open中出现内存泄漏,请指导我出错的地方.项目在非ARC. -(BOOL)saveMedia:(NSDictionary *)details Download:(NSInteger)completed{ //NSLog(@"media savemedia %@",[details objectF 即使应用sqlite_close,sqlite3_finalize,我也会在sqlite3_open中出现内存泄漏,请指导我出错的地方.项目在非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],NulL);        sqlite3_bind_text(statement,2,[[details objectForKey:@"Title"] UTF8String],3,[[details objectForKey:@"description"] UTF8String],4,[[details objectForKey:@"file"] UTF8String],5,[[details objectForKey:@"vIEws"] UTF8String],6,[[details objectForKey:@"thumbnail"] UTF8String],7,[[details objectForKey:@"version"] UTF8String],8,[[details objectForKey:@"playList"] UTF8String],9,[[details objectForKey:@"playList_ID"] UTF8String],10,[[details objectForKey:@"author"] UTF8String],11,[[details objectForKey:@"created_at"] UTF8String],12,[[details objectForKey:@"type"] UTF8String],13,[[details objectForKey:@"playList_created"] UTF8String],14,[[details objectForKey:@"timeout"] UTF8String],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],18,[[details objectForKey:@"playList_promo_url"] UTF8String],19,[[details objectForKey:@"playList_promo_img"] UTF8String],20,[[details objectForKey:@"vIDeo_promo_text"] UTF8String],21,[[details objectForKey:@"vIDeo_promo_url"] UTF8String],22,[[details objectForKey:@"vIDeo_promo_img"] UTF8String],23,[[details objectForKey:@"dev_ID"] intValue]);        sqlite3_bind_text(statement,24,[[details objectForKey:@"device_ID"] UTF8String],25,(int)completed);        sqlite3_bind_text(statement,26,[[details objectForKey:@"slIDe_timeout"] UTF8String],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;}

在上面的代码中,我通过考虑数据是否已经存在,将数据从NSdictionary插入或更新到sqlite表.该方法执行正常,但它会产生严重的内存泄漏(该方法从循环中多次调用),当在Instrument中检查时,它显示泄漏位于if(sqlite3_open(dbpath,& wazzupco)== sqlITE_OK).

来自仪器

泄露的对象:Malloc 64Bytes

18

地址
大小:1.12KB
责任图书馆:libsqlite3.dylib
负责框架:0x34bdce30

解决方法 当执行“else”情况时,似乎上述代码中的内存泄漏.

if (sqlite3_open(dbpath,&wazzupco) == sqlITE_OK){    const char *query_stmt;    if (exists == 0)    {        query_stmt = "INSERT INTO media (media_ID,?)";    }    else if([[details objectForKey:@"version"] integerValue] > exists)    {        Nsstring *querysql = [Nsstring stringWithFormat:@"UPDATE %@ SET media_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;    }

触发else情况时,未到达sqlite3_close()并导致sqlite3_open发生内存泄漏

总结

以上是内存溢出为你收集整理的ios – Objective C – sqlite3_open即使应用了sqlite3_close(),内存也会泄漏全部内容,希望文章能够帮你解决ios – Objective C – sqlite3_open即使应用了sqlite3_close(),内存也会泄漏所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1046798.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-24
下一篇 2022-05-24

发表评论

登录后才能评论

评论列表(0条)

保存