下面是我的源代码,每次执行该函数时,内存使用量都会急剧增加。请帮忙指出是什么问题。
func loadfontsFromDatabase(code:String)->[String] {
let documentsPath : AnyObject = NSSearchPathForDirectoriesInDomains(.documentDirectory,.userDomainMask,true)[0] as AnyObject
let databasePath = documentsPath.appending("/bsmcoding.sqlite")
let contactDB = FMDatabase(path: databasePath as String)
var c:[String]=[]
let querySQL = "SELECT FONT FROM BSMCODE WHERE BSMCODE.CODE = '\(code)' ORDER BY NO DESC"
NSLog("query:\(querySQL)")
let results:FMResultSet? = Constants.contactDB?.executeQuery(querySQL, withArgumentsIn: nil)
while (results?.next())! {
c.append((results?.string(forColumn: "FONT"))!)
}
results?.close()
return c
}
最佳答案
这里没有任何东西可以解释任何严重的内存丧失。我建议使用 Xcode 8 中的“调试内存图”功能来识别正在创建和未释放的对象,但我怀疑问题出在代码的其他地方。或者使用 Instruments 来追踪泄漏的内容并从那里进行调试。参见 https://stackoverflow.com/a/30993476/1271826 .
不过这里有一些不相关的问题:
您正在创建本地
contactDB
,但您从未打开它也从未使用过它。它会在例程退出时释放,但如果您打算使用Constants.contactDB
,则完全没有必要。我建议不要在构建 SQL 时使用字符串插值。使用
?
占位符并将code
作为参数传入。这样会更安全,以防代码中包含无法在 SQL 语句中表示的内容。 (如果code
是由用户提供的,则尤其如此,在这种情况下,您很容易受到 SQL 注入(inject)攻击或可能导致崩溃的无辜输入错误。)例如,你可以这样做:
func loadfontsFromDatabase(code: String) -> [String] { var c = [String]() let querySQL = "SELECT FONT FROM BSMCODE WHERE BSMCODE.CODE = ? ORDER BY NO DESC" let results = try! Constants.contactDB!.executeQuery(querySQL, values: [code]) while results.next() { c.append((results.string(forColumn: "FONT"))!) } return c }
如果你不喜欢强制解包,你可以根据需要进行可选的解包,但我个人宁愿在开发阶段调试时立即知道是否存在逻辑错误(例如
contactDB
未打开,SQL 不正确等)。但是您可以进行可选绑定(bind),并根据需要添加必要的guard
语句。但是,不要只是进行可选绑定(bind)并默默地返回一个值,表明一切都是复杂的,如果您没有得到预期的结果,就会给您带来调试挑战,即跟踪问题。但关键是要避免直接将值插入到 SQL 中。使用
?
占位符。
关于swift - 每次 FMDB 查询后内存使用量急剧增加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42982930/