gpt4 book ai didi

swift - 字符串比较期间 SwiftyJSON 崩溃 : swift_unknownRetain

转载 作者:搜寻专家 更新时间:2023-10-31 22:16:09 28 4
gpt4 key购买 nike

我正在从服务器打开一个标志,以确定要实例化的对象类型。每个类型都是返回类型的子类(Snack,在示例中。)我的猜测是整个子类与主要问题无关,但为了完整起见我将其包括在内。

问题是,我经常在 case "chips": 行收到来自 Crashlytics 的崩溃报告。为了简化初始化程序中的解析,我将服务器响应包装在 SwiftyJSON JSON 中。这一切在测试中都运行良好。

class func fromJSON(json: JSON) -> Snack {
switch json["SnackName"] {
case "chips": // CRASH OCCURS HERE
return BagOChips(json: json)
case "apple":
return Apple(json: json)
default:
return Spam(json: json)
}
}

具体来说,崩溃发生在“SwiftyJSON.swift:1013”(如下所示)。 Crashlytics 将其描述为“0x0000000093a4bec8 处的 EXC_BAD_ACCESS KERN_INVALID_ADDRESS”和“swift_unknownRetain + 32”。

public func ==(lhs: JSON, rhs: JSON) -> Bool {

switch (lhs.type, rhs.type) {
case (.Number, .Number):
return (lhs.object as NSNumber) == (rhs.object as NSNumber)
case (.String, .String):
return (lhs.object as String) == (rhs.object as String) // CRASH REALLY OCCURS HERE
case (.Bool, .Bool):
return (lhs.object as Bool) == (rhs.object as Bool)
case (.Array, .Array):
return (lhs.object as NSArray) == (rhs.object as NSArray)
case (.Dictionary, .Dictionary):
return (lhs.object as NSDictionary) == (rhs.object as NSDictionary)
case (.Null, .Null):
return true
default:
return false
}
}

知道为什么会失败以及我可以在下一个版本中纠正它吗?

最佳答案

找到问题了,原来它是晦涩难懂的!

TL;DR - 通过替换

完全避免 SwiftyJSON 的 == 函数
switch json["SnackName"]

switch json["SnackName"].stringValue

总的来说,这可能是个好主意,但它之所以有必要,似乎是 Swift + Foundation 处理字符串的方式中存在的一个错误。我已经提交了一份公开雷达 here .

重现此问题只需要 Xcode 6.1、SwiftyJSON 和我提交给 Apple 的以下示例代码:

let d = NSDictionary(dictionary: ["foo": "bar"])
let j = JSON(d)

switch (j["foo"]) {
case "bar":
println("> No crash!")
default:
println("> default")
}

然后将这些日志记录语句放入您的 SwiftyJSON 副本中。

public func ==(lhs: JSON, rhs: JSON) -> Bool {
// Next 2 lines added just for SwiftyCrasher test project.
println( "> Left: \(_stdlib_getTypeName(lhs.object))" )
println( "> Right: \(_stdlib_getTypeName(rhs.object))" )

switch (lhs.type, rhs.type) {
case (.Number, .Number):
return (lhs.object as NSNumber) == (rhs.object as NSNumber)
case (.String, .String):
...
}

这显示了以下控制台输出,就在崩溃之前:

> Left: _TtCSs19_NSContiguousString
> Right: _TtCSs19_NSContiguousString

同样,在 Debug模式下,这不会崩溃。在 NSString 中对“foo”和“bar”进行装箱,或者将 j["foo"] 更改为 j["foo"].stringValue 也可以防止崩溃。

关于swift - 字符串比较期间 SwiftyJSON 崩溃 : swift_unknownRetain,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28790277/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com