-(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
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(),内存也会泄漏所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)