Swift 每次FMDB查询后,内存使用量急剧增加
下面是我的源代码,每次执行该函数时,内存使用量都会急剧增加。请帮助指出问题所在Swift 每次FMDB查询后,内存使用量急剧增加,swift,memory,fmdb,Swift,Memory,Fmdb,下面是我的源代码,每次执行该函数时,内存使用量都会急剧增加。请帮助指出问题所在 func loadfontsFromDatabase(code:String)->[String] { let documentsPath : AnyObject = NSSearchPathForDirectoriesInDomains(.documentDirectory,.userDomainMask,true)[0] as AnyObject let databasePath = doc
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中的“调试内存图”功能来识别哪些对象正在创建而哪些对象没有发布,但我怀疑问题在代码的其他地方。或者用仪器来追踪泄漏的东西,然后进行调试。看 不过,这里有一些不相关的问题:
contactDB
,但您从未打开它,也从未使用过它。当例程退出时,它将被释放,但如果您打算使用常量。contactDB
,则它完全没有必要?
占位符并将代码作为参数传入。如果代码中包含SQL语句中无法表示的内容,这将更加安全。(如果代码
是由用户提供的,尤其如此,在这种情况下,您很容易受到SQL注入攻击或可能导致崩溃的无辜输入错误的影响。)
例如,您可以执行以下操作:
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不正确等)。但是,如果需要,您可以执行可选绑定并添加必要的guard
语句。但是,不要只是执行可选绑定,然后静默地返回一个值,表示所有内容都是协同的,这会给您带来一个调试挑战,即如果您没有得到预期的结果,就要跟踪问题
但关键是要避免将值直接插入SQL。使用?
占位符
这里没有任何东西可以解释任何实质性的记忆丧失。我建议使用Xcode 8中的“调试内存图”功能来识别哪些对象正在创建而哪些对象没有发布,但我怀疑问题在代码的其他地方。或者用仪器来追踪泄漏的东西,然后进行调试。看 不过,这里有一些不相关的问题:
contactDB
,但您从未打开它,也从未使用过它。当例程退出时,它将被释放,但如果您打算使用常量。contactDB
,则它完全没有必要?
占位符并将代码作为参数传入。如果代码中包含SQL语句中无法表示的内容,这将更加安全。(如果代码
是由用户提供的,尤其如此,在这种情况下,您很容易受到SQL注入攻击或可能导致崩溃的无辜输入错误的影响。)
例如,您可以执行以下操作:
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不正确等)。但是,如果需要,您可以执行可选绑定并添加必要的guard
语句。但是,不要只是执行可选绑定,然后静默地返回一个值,表示所有内容都是协同的,这会给您带来一个调试挑战,即如果您没有得到预期的结果,就要跟踪问题
但关键是要避免将值直接插入SQL。使用?
占位符
非常感谢。我发现了问题所在。在执行查询之后,显示发生了很大的变化,并占用了大量内存。现在我在想如何解决这个问题。谢谢,我认为下面是问题的根源。如何修改它,使其在每次执行时不会占用大量内存。请帮忙,谢谢。我发现了问题所在。在执行查询之后,显示发生了很大的变化,并占用了大量内存。现在我在想如何解决这个问题。谢谢,我认为下面是问题的根源。如何修改它,使其在每次执行时不会占用大量内存。请帮忙。