2017-03-02 76 views
6

应用程序崩溃时调用该函数在发布版(用于调试它的作品完美无瑕)EXC_BAD_ACCESS当斯威夫特字符串转换为数据

func crashMe() 
{ 
    func crashHelper(str: String) {} 

    var crashString = "123" 
    crashString.remove(at: crashString.startIndex) 

    crashHelper(str: "\(crashString)") 

    crashString.data(using: .ascii) 
} 

几乎总是再现真实设备并经常在模拟器(但不是100%)的无论是iOS的9或10

从这个功能删除任何行可防止碰撞

,该怎么办错了或者也许是一些斯威夫特错误?

它可以在不同的地方坠毁,坠毁日志之一:

0x02194b8a在swift_unknownRelease()

0x020702c5在_NSContiguousString .__ deallocating_deinit()

在String.data 0x024cea26(使用: String.Encoding,allowLossyConversion:Bool) - > Data? ()

0x0007e04f专门AppDelegate.crashMe() - >()

0x0007c31c在AppDelegate.crashMe() - >()[内嵌]()

+0

更新的问题描述,请尝试在真实的设备上 – abagmut

+0

你有没有崩溃日志? – Larme

+0

增加了其中一个 – abagmut

回答

1

这是一个更新我的最初的答案,尽管它更像是一份调查报告而不是答案。

我能够在Release build中的简单macOS命令行实用程序中重现该问题。以下是main.swift的内容。

import Foundation 

func crashMe() { 

    func crashHelper(str: String) { 
//  print("crashHelper() got \(str)") // line 1 
     print("In crashHelper()!") // line 2 
//  var i = 123; i += 321; print("In crashHelper() the int is \(i)") // line 3 
    } 

    var crashString = "123" 
    crashString.remove(at: crashString.startIndex) 
    crashHelper(str: "\(crashString)") 

// if let stringData = crashString.data(using: .ascii) { 
//  print("stringData has \(stringData.count) bytes") 
// } 
} 

crashMe() 
print("Success!!!") 

一些观察:

  • 崩溃一贯发生在swift_unknownRetaincrashMe()被调用。
  • 如果crashHelper()中的第2行被注释掉了,即该函数有一个空的主体,那么if块必须取消注释才能发生崩溃,现在发生在crashString.data()调用中。
  • 如果第1行和/或第3行未注释,则程序不会崩溃,而不管第2行是否存在。
  • crashHelper()不必在另一个函数内部定义;它可以是顶层函数,但将其放入函数会使崩溃更可能发生。
  • 通过crashString没有字符串插值到crashHelper()将解决上述崩溃。

因此,我会说这是一个Swift错误如何实现字符串插值。

+0

这是一个最小的崩溃版本:'func crashHelper(str:String){}; var crashString =“123”; crashString.remove(at:crashString.startIndex); crashHelper(str:“\(crashString)”); print(“成功!!!”)'如果你注释掉'print'行,不会崩溃;我真的不明白这一点。 – matt

相关问题