*** 由于未捕获的异常“NSGenericException”而终止应用程序,原因:“开始日期不能晚于结束日期!”

Posted

技术标签:

【中文标题】*** 由于未捕获的异常“NSGenericException”而终止应用程序,原因:“开始日期不能晚于结束日期!”【英文标题】:*** Terminating app due to uncaught exception 'NSGenericException', reason: 'Start date cannot be later in time than end date!' 【发布时间】:2016-11-21 15:25:51 【问题描述】:

我正在使用 Alamofire,在我的应用程序在模拟器上运行了几个小时后,我因为这个错误而崩溃。

我在控制台中得到了这个堆栈跟踪:

*** First throw call stack:
(
    0   CoreFoundation                      0x0000000111186d4b __exceptionPreprocess + 171
    1   libobjc.A.dylib                     0x0000000110be821e objc_exception_throw + 48
    2   Foundation                          0x00000001107f0e3c -[_NSConcreteDateInterval dealloc] + 0
    3   CFNetwork                           0x00000001131a18e8 -[__NSCFURLSessionTaskMetrics _initWithTask:] + 868
    4   CFNetwork                           0x00000001131a1497 -[NSURLSessionTaskMetrics _initWithTask:] + 100
    5   CFNetwork                           0x0000000112f77bc7 -[__NSCFURLLocalSessionConnection _tick_finishing] + 351
    6   libdispatch.dylib                   0x00000001128e3978 _dispatch_call_block_and_release + 12
    7   libdispatch.dylib                   0x000000011290d0cd _dispatch_client_callout + 8
    8   libdispatch.dylib                   0x00000001128eae17 _dispatch_queue_serial_drain + 236
    9   libdispatch.dylib                   0x00000001128ebb4b _dispatch_queue_invoke + 1073
    10  libdispatch.dylib                   0x00000001128ee385 _dispatch_root_queue_drain + 720
    11  libdispatch.dylib                   0x00000001128ee059 _dispatch_worker_thread3 + 123
    12  libsystem_pthread.dylib             0x0000000112cbc736 _pthread_wqthread + 1299
    13  libsystem_pthread.dylib             0x0000000112cbc211 start_wqthread + 13
)
libc++abi.dylib: terminating with uncaught exception of type NSException

有人遇到过类似的崩溃吗?

谢谢

【问题讨论】:

发布一些你正在处理日期的代码 是的,我在我的应用程序中使用了一些日期,但我无法知道导致此崩溃的日期,正如您在堆栈跟踪中看到的那样。 贴出你使用日期的代码以及如何使用 【参考方案1】:

我也遇到了同样的崩溃,今天做了一些研究,发现了这个:

http://www.openradar.me/28301343

看起来 Apple 在 ios 10.2 中修复了这个问题。只是觉得它可以帮助你!

【讨论】:

这是完美的。谢谢。【参考方案2】:

是的,我刚刚遇到了同样的崩溃。它发生在后台线程中,似乎与发出 URL 会话网络请求有关。我想知道这是否是某种多线程错误与我同时发出两个网络请求的事实有关。我也在使用 Alamofire,但不确定该错误是在 Alamofire 中还是在 Apple 的代码中。到目前为止,我一直无法复制它。也许您可以弄清楚如何重现它,然后在 Apple 的 bug 雷达或 Alamofire GitHub 存储库中提交问题。

【讨论】:

看起来真的很相似。谢谢!【参考方案3】:

这是 Apple 的 NSURLSessionTaskMetrics 代码中的一个错误,发生在网络请求期间,当用户的时钟向后移动足够远以至于请求开始时间戳在请求结束时间戳之后。这可以使用网络调试代理和手动调整时钟来重现,并且只发生在 iOS 10.0 到但不包括 iOS 10.2

如果您使用 Alamofire,并且不需要 NSURLSessionTaskMetrics,则可以通过为您的 SessionManager 使用自定义 SessionDelegate 并覆盖 responds(to aSelector..) 函数来解决此问题,例如:

class MySessionDelegate: Alamofire.SessionDelegate 
    override public func responds(to aSelector: Selector) -> Bool 
        let result: Bool = super.responds(to: aSelector)
        if #available(iOS 10.2, *) 
            // NSURLSessionTaskMetrics date crash is fixed
            return result
         else if #available(iOS 10.0, *) 
            // NSURLSessionTaskMetrics date crash is not fixed, turn off metric collection
            if aSelector ==  #selector(self.urlSession(_:task:didFinishCollecting:)) 
                return false
             else 
                return result
            
         else 
            // NSURLSessionTaskMetrics doesn't exist
            return result
        
    

如果您使用默认的SessionManager(例如调用Alamofire.request(...)),您可以创建自己的SessionManager 以使用您的自定义SessionDelegate

let sessionManager: Alamofire.SessionManager = 
    let configuration: URLSessionConfiguration = URLSessionConfiguration.default
    configuration.httpAdditionalHeaders = SessionManager.defaultHTTPHeaders
    return Alamofire.SessionManager(configuration: configuration, delegate: MySessionDelegate(), serverTrustPolicyManager: nil)
()

现在你可以打电话给sessionManager.request(...)而不是Alamofire.request(...)

【讨论】:

嘿,这对你有用吗?不幸的是,这并不能解决我的问题,停止崩溃的唯一方法是如果我进入 SessionDelegate 并删除 didFinishCollecting 方法。你遇到了什么崩溃? 这对我有用,应该与删除 didFinishCollecting 方法相同(无需修改 Alamofire)。我得到/重现了与原始问题完全相同的崩溃。您是在使用 AlamofireImage,还是不使用此 SessionDelegate 来处理您的所有请求? 是的,我仍然收到错误消息。我正在使用 Alamofire,并且刚刚升级到 XCode8.2,我没有看到 10.2 中的问题,只是在 10.0 和 10.1 之间,正如人们在这里提到的那样。我已经添加了你的代码,并且我同意你的观点,代码应该可以工作,但似乎 URLSession 正在以其他方式寻找指标方法。我仍然收到此错误。我会做进一步的调试,我会看看我可以在不删除指标方法的情况下找到解决这个问题的方法。【参考方案4】:

在过去的几个月里,我一直在 os x 应用程序中解决这个问题,并找到了解决方法。

背景: 就像 OP 一样,我使用 Alamofire 通过 Timer 请求 JSON 数据,每秒发送多次请求。数据按预期输入,但是我以不规则的时间间隔随机崩溃,并显示与 OP 相同的消息,即 开始日期不能晚于结束日期! 等等。

解决方案: 我没有定期发送 Alamofire 请求,而是添加了一些逻辑,在发送下一个请求之前检查前一个请求的返回。这完全消除了随机崩溃。

希望对你有帮助:)

@thierryb

【讨论】:

以上是关于*** 由于未捕获的异常“NSGenericException”而终止应用程序,原因:“开始日期不能晚于结束日期!”的主要内容,如果未能解决你的问题,请参考以下文章

目标 C:由于未捕获的异常“NSInvalidArgumentException”而终止应用程序

由于未捕获的异常而终止应用程序 [UIImageView _isResizable]

由于未捕获的异常而终止应用程序,同时加载视图

由于未捕获的异常“NSInternalInconsistencyException”错误而终止应用程序

“由于未捕获的异常而终止应用程序”在推送视图控制器时崩溃

由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,