swift - 每次 FMDB 查询后内存使用量急剧增加

标签 swift memory fmdb

下面是我的源代码,每次执行该函数时,内存使用量都会急剧增加。请帮忙指出是什么问题。

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 .

不过这里有一些不相关的问题:

  1. 您正在创建本地 contactDB,但您从未打开它也从未使用过它。它会在例程退出时释放,但如果您打算使用 Constants.contactDB,则完全没有必要。

  2. 我建议不要在构建 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/

相关文章:

ios - 在 ViewController 之外显示 UIAlertController

arrays - 切换数组中的 UI 按钮以选择/取消选择

ios - 如何在 tableView 之外获取所有自定义 tableview 单元格 textField 和 textView 值

database - 为什么在 SQLite 中插入一个 Integer 会失败?

ios - 快速将数据从 IOS 应用程序传输到 Watch 应用程序

ios - 从 SQLite 表 iOS 中检索值

ios - 发出多个异步请求,但仅等待一个

c++ - 使用 malloc() 和 free() 实现一个简单的分配器类

Calloc分配不一致

python - 短标量中的 Numpy 溢出