Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 每次FMDB查询后,内存使用量急剧增加_Swift_Memory_Fmdb - Fatal编程技术网

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语句中无法表示的内容,这将更加安全。(如果
    代码
    是由用户提供的,尤其如此,在这种情况下,您很容易受到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语句中无法表示的内容,这将更加安全。(如果
    代码
    是由用户提供的,尤其如此,在这种情况下,您很容易受到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。使用
    占位符


  • 非常感谢。我发现了问题所在。在执行查询之后,显示发生了很大的变化,并占用了大量内存。现在我在想如何解决这个问题。谢谢,我认为下面是问题的根源。如何修改它,使其在每次执行时不会占用大量内存。请帮忙,谢谢。我发现了问题所在。在执行查询之后,显示发生了很大的变化,并占用了大量内存。现在我在想如何解决这个问题。谢谢,我认为下面是问题的根源。如何修改它,使其在每次执行时不会占用大量内存。请帮忙。