gpt4 book ai didi

ios - 在发布目标中使用 NSStringFromClass() 时应用程序崩溃

转载 作者:可可西里 更新时间:2023-11-01 02:05:24 26 4
gpt4 key购买 nike

各位开发者大家好,

我目前正面临一些 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 预处理器指令为 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)
...

我敢肯定这是愚蠢的...也许类在日志发生之前被释放,导致 self typeof 为 nil。

欢迎就此主题发表任何见解,感谢您的贡献/评论。

编辑

我已经能够通过在 Release模式下启用测试来重现该问题,似乎禁用优化以检查参数内容解决了该问题。

也许其中之一是增加某种安全性......我会在尝试找到解决方法时进行更深入的研究。

最佳答案

好的,我找到了罪魁祸首:

let className = NSStringFromClass(aClass)
Log.warning("Failed to create \(className) object from JSON: \(json)")

NSStringFromClass() 函数在启用 Swift 优化时中断(SWIFT_OPTIMIZATION_LEVEL)。

我将其替换为以下内容:

let className = String(describing: aClass)
Log.warning("Failed to create \(className) object from JSON: \(json)")

现在一切正常,但测试起来很痛苦......

我将更新帖子名称以反射(reflect)此错误与字典问题不同。

关于ios - 在发布目标中使用 NSStringFromClass() 时应用程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43208598/

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