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

时间:2017-04-04 13:25:42

标签: ios swift

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。

欢迎任何有关该主题的见解,感谢您的贡献/评论。

修改

我已经能够通过在发布模式下启用测试来复制该问题,似乎禁用优化来检查参数的内容是否解决了问题。

也许其中一个是增加某种安全性......我会在寻找解决方法时深入挖掘。

1 个答案:

答案 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)")

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

我会更新帖子名称,以反映此错误与字典问题不同。