Hello开发人员,
我目前面临着一些奇怪的问题,其中包含一些 Swift 3 代码。
我有一个自定义日志记录类(使用 XCGLogger ):
struct Log {
#if DEBUG
fileprivate static let Logger: XCGLogger = {
let logger = XCGLogger(identifier: "API")
if let standardConsoleDestination = logger.destination(withIdentifier: XCGLogger.Constants.baseConsoleDestinationIdentifier) as? ConsoleDestination {
standardConsoleDestination.showLogIdentifier = true
standardConsoleDestination.showFunctionName = false
standardConsoleDestination.showThreadName = false
standardConsoleDestination.showLevel = true
standardConsoleDestination.showFileName = false
standardConsoleDestination.showLineNumber = false
standardConsoleDestination.showDate = true
standardConsoleDestination.outputLevel = .debug
}
return logger
}()
#endif
fileprivate static func log(_ level: XCGLogger.Level, message: String) {
#if DEBUG
Logger.logln("[] \(message)", level: level, userInfo: [:])
#endif
}
static func warning(_ message: String) {
log(.warning, message: message)
}
static func parseFailure(in aClass: AnyClass, json: [String: Any]) {
let className = NSStringFromClass(aClass)
Log.warning("Failed to create \(className) object from JSON: \(json)")
}
}
DEBUG 预处理器指令在调试模式下被激活。
然后我使用此方法从JSON有效负载实例化对象:
required init?(json: [String: Any]) {
guard
let value1 = json["value1"] as? String,
let value2 = json["value2"] as? String
else {
Log.parseFailure(in: type(of: self), json: json)
return nil
}
self.value1 = value1
self.value2 = value2
}
这是非常基本的,但它只是为了说明我遇到的情况。
我遇到了以下崩溃:
Exception Type: EXC_BAD_ACCESS (SIGSEGV)
Exception Subtype: KERN_INVALID_ADDRESS at 0x0000000e115ebec8
1 MyProject 0x00000001015cb92c static Log.parseFailure -> () (in MyProject) (Log.swift:0)
2 MyProject 0x000000010151c9a0 Object.init(json : [String : Any]) -> Object? (Object.swift:0)
...
我确定这是愚蠢的......可能在Log发生之前被释放的类,导致 self 类型为nil。
欢迎任何有关该主题的见解,感谢您的贡献/评论。
修改
我已经能够通过在发布模式下启用测试来复制该问题,似乎禁用优化来检查参数的内容是否解决了问题。
也许其中一个是增加某种安全性......我会在寻找解决方法时深入挖掘。
答案 0 :(得分:1)
好的,我找到了罪魁祸首:
let className = NSStringFromClass(aClass)
Log.warning("Failed to create \(className) object from JSON: \(json)")
启用 Swift 优化时,NSStringFromClass()
功能正在中断( SWIFT_OPTIMIZATION_LEVEL )。
我将其替换为以下内容:
let className = String(describing: aClass)
Log.warning("Failed to create \(className) object from JSON: \(json)")
现在一切正常,但测试很痛苦......
我会更新帖子名称,以反映此错误与字典问题不同。