除非我关闭优化,否则Swift - 释放构建崩溃

Tom*_*sen 2 crash 64-bit ios swift

这是在XCode 6.2上.

如果我在发布模式下运行应用程序它将崩溃,但如果优化关闭它不会崩溃.代码看起来很简单.我已经对ObjC进行了十多年的编程,所以对于编程等不是新手.

我注意到在32位它在发布模式(Fastest -O)中运行良好,但在64位真正的iOS硬件上它崩溃了.

这是编译器错误吗?或者是否可能只有一些编译器设置崩溃(可能发生在C!).

我包含代码,但我不确定它会有所帮助.

class func attemptLogin(completionHandler: (result: JSON?, error: NSError?) -> ()) {
    // It appears that these variables are not working in the completion block in 64 with optimization on.
    let email = User.email
    let password = User.password

    // setup login.
    let parameters: [String : AnyObject] = [
        "action": "login",
        "login": [
            "email": email,
            "password": password,
            "type": User.type
        ]
    ]

    // Fire off REST POST Async
    request(.POST, baseUrl, parameters: parameters, encoding: .JSON)
        .responseSwiftyJSON { (request, response, jsonDict, error) in

                // in release mode on 64 bit, things are seriously bad here. 
            println("jsonDict login attempt: ")
            print(jsonDict)

            if let token = jsonDict["login"]["token"].string {
                println("token found is: " + token)
                User.token = token;
                User.email = email;
                User.password = password;
                completionHandler(result: jsonDict, error: nil)
            } else {
                println("No Token")
                User.token = "";
                User.email = "";
                User.password = "";

                let errorNS = NSError(domain: "stethIoUser", code: 404, userInfo: nil)

                completionHandler(result: jsonDict, error: errorNS)
            }
        }
}
Run Code Online (Sandbox Code Playgroud)

Mik*_*rne 5

我昨天也有类似的情况.

我正在运行Xcode 6.2.

如果我在发布模式下运行我的应用程序它会崩溃,但如果优化关闭它并没有在发布模式下崩溃.(在调试模式下运行正常.)

问题?这行代码:

let parts = split(columnLetters, { $0 == "," })
Run Code Online (Sandbox Code Playgroud)

是的.就是这样.该split函数根本没有拆分我的字符串.相反,它将整个原始字符串分配给parts数组的第一个元素.毫不奇怪,这导致了应用程序中的崩溃.

我用这个替换了那行代码,它起作用了:

let parts = columnLetters.componentsSeparatedByString(",")
Run Code Online (Sandbox Code Playgroud)

由于以下原因,此错误特别难以追踪:

  1. 该应用程序在测试期间运行正常,因为它是在调试模式下编译的.消除其他因素(iOS版本,prod与测试数据)需要一些时间来实现崩溃仅发生在发布模式中.

  2. 如果我们关闭优化,该应用程序在发布模式下工作.

  3. 崩溃与我们上次在两个月前部署的上一个成功发布版本引入的任何新代码无关.split到目前为止,我们一直在使用该功能.

  4. 崩溃没有发生在问题的代码行上.它发生在应用程序的后期,因为字符串没有被拆分.

  5. 代码在发布模式下编译良好.没有编译错误指向该split函数的问题.该函数根本没有拆分字符串.

我没有在Xcode 6.3或更高版本上测试过这个.(由于其他原因,我们无法升级到Xcode 6.3/Swift 1.2,但很快就会升级.)