Ios EXC\u错误\u访问内核\u无效\u地址崩溃
我的应用程序一直通过Xcode在调试模式下运行良好,但每当通过TestFlight下载时,它都会因以下错误而崩溃:Ios EXC\u错误\u访问内核\u无效\u地址崩溃,ios,swift,exc-bad-access,Ios,Swift,Exc Bad Access,我的应用程序一直通过Xcode在调试模式下运行良好,但每当通过TestFlight下载时,它都会因以下错误而崩溃:EXC\u BAD\u ACCESS KERN\u INVALID\u ADDRESS 0x000200013f7b9e78 它在这条线上崩溃了。我在这个堆栈跟踪中看到了专用数组。WithUnsafemtableBufferPoint,它可能与此相关 self.array.sortInPlace. { (($0 as Dictionary<Str
EXC\u BAD\u ACCESS KERN\u INVALID\u ADDRESS 0x000200013f7b9e78
它在这条线上崩溃了。我在这个堆栈跟踪中看到了专用数组。WithUnsafemtableBufferPoint
,它可能与此相关
self.array.sortInPlace. {
(($0 as Dictionary<String, AnyObject>)["time"] as? String) > (($1 as Dictionary<String, AnyObject>)["time"] as? String)
}
更新:
这都在Swift 2中,数组是一个字典数组,声明为var-array=[[String:AnyObject]]()
。它是通过附加一系列字典来填充的,就像这样
self.dict["foo"] = 0
self.dict["bar"] = "dog"
self.array.append(self.dict)
我担心的是它在一个调度组中通知;它正在等待一系列的dispatch\u group\u leave
s。这可能与此有关吗?看起来是这样的:
dispatch_group_notify(group, queue) { () -> Void in
self.array.sortInPlace {
(($0["foo"] as? Int) > (($1 )["foo"] as? Int))
}
}
关于更新中的代码:
由于数组是“手动”填充的,因此最可靠(也是有效且符合Swift类型安全性的)方法是使用具有非可选属性的自定义类,而不是通用字典
class Item {
var foo : Int
var bar : String
init(foo : Int, bar : String) {
self.foo = foo
self.bar = bar
}
}
var array = [Item]()
array.append(Item(foo: 0, bar: "dog"))
array.append(Item(foo: 1, bar: "cat"))
array.sortInPlace { $0.foo > $1.foo }
所有类型都是众所周知的非可选类型
没有类型转换,没有拆封,没有开销,没有问题。我也遇到同样的问题,但它只影响约50%的设备,并且只影响运行该应用程序的版本的设备。我的代码没有使用类似于dispatch\u group
的任何东西
就我而言,我使用的代码如下:
contacts.sortInPlace({ $0.name.localizedCaseInsensitiveCompare($1.name) == .OrderedAscending })
当我将其替换为以下内容时,它已修复:
contacts = contacts.sort({ $0.name.localizedCaseInsensitiveCompare($1.name) == .OrderedAscending })
由于它只影响有限数量的用户,在低级别的Swift API中崩溃,并通过替换为排序
进行修复,我相信这是苹果代码中的一个缺陷
我建议同时使用sort
注意:您的代码和我的代码之间的另一个相似之处是(即$0和$1)的用法。然而,即使我用命名参数替换这些参数,它仍然会崩溃
更新:很多人都是。根据该线程,它似乎在最新的Xcode测试版中得到了修复 这是一个老问题,但在调试运行中很难重现EXC_BAD_ACCESS KERN_INVALID_ADDRESS的主要原因是调试版本和发布版本中释放对象的生命周期不同。在后者中,内存会立即消失,可能会被一个不相关的对象替换,而在前者中,内存可能仍会保留一段时间,因此您的应用程序仍然可以顺利运行。同样,当这种情况在发布版本中发生时,崩溃跟踪的最后一行可能会令人困惑,因为引用的对象可能是完全不相关的类型。如果是这种情况,我们应该在堆栈树中查找一点,希望能找到更多线索。我遇到的一个错误是我在Objective-C中声明了一个非null属性,但忘记了初始化它,然后尝试在Swift中使用它。那么这个数组是什么,它是如何声明的,它是如何填充的,里面有什么?@matt see更新。如果您需要更多信息,请告诉我。这可能不相关,但我很难理解尝试对可选项进行排序有什么意义。如果你知道这些东西是Int或者String或者其他的,你应该把它们排序为Int或者String或者其他的。在进行强制转换时是否存在失败的可能性,如果是,那么在这种情况下会发生什么?我无法将二进制运算符应用于两个AnyObject
s,因此我需要键入将数组的字典值强制转换为某个值,在本例中为Int。没有失败的可能性。我刚打开包装,谢谢你的接球,但我不确定这是否是我的大问题。铸造,好的。但你是随意选角的($0[“foo”]as?Int
不是Int。它是可选的。正如我所说,这可能无关紧要,但在这种情况下做这件事很奇怪。
contacts = contacts.sort({ $0.name.localizedCaseInsensitiveCompare($1.name) == .OrderedAscending })