在调试app时,发现数据库的FMDB使用了大量内存,经过语句注释排查,发现是[FMResultSet resultDictionary]方法中的NSString *columnName
= [NSString stringWithUTF8String:sqlite3_column_name([_statement statement],
columnIdx)];语句,它new出来的NSString没有释放掉.经过查找发现是以下原因:app的schema中打开了Objective-C的Enable Zombie Objects设置.关闭它之后,内存的释放就正常了.
注:当app的schema参数中,打开了Objective-C的Enable Zombie Objects时,会导致app的内存不会及时释放.Enable Zombie Objects参数的作用就是持有引用计数为0的僵尸对象.在该情况下,僵尸对象的dealloc方法是会被调用到的,但它占用的内存却不会被回收.此功能一般用于查找因访问引用计数为0的内存对象,而引起的内存访问错误.