在 objc_object::release() 中崩溃

Ore*_*ex0 1 ios nsurlsession swift

我的应用程序崩溃了,这是调用堆栈:

Crashed: com.apple.NSURLSession-work
0  libobjc.A.dylib                0x1829d17f4 objc_object::release() + 16
1  libsystem_blocks.dylib         0x18318ca5c _Block_release + 152
2  libdispatch.dylib              0x1830ecae4 _dispatch_client_callout + 16
3  libdispatch.dylib              0x1831297a8 _dispatch_continuation_pop$VARIANT$armv81 + 416
4  libdispatch.dylib              0x183132acc _dispatch_source_invoke$VARIANT$armv81 + 908
5  libdispatch.dylib              0x18312b074 _dispatch_queue_serial_drain$VARIANT$armv81 + 248
6  libdispatch.dylib              0x18312bad8 _dispatch_queue_invoke$VARIANT$armv81 + 328
7  libdispatch.dylib              0x18312c47c _dispatch_root_queue_drain_deferred_wlh$VARIANT$armv81 + 332
8  libdispatch.dylib              0x18313444c _dispatch_workloop_worker_thread$VARIANT$armv81 + 612
9  libsystem_pthread.dylib        0x18341fe70 _pthread_wqthread + 860
10 libsystem_pthread.dylib        0x18341fb08 start_wqthread + 4
Run Code Online (Sandbox Code Playgroud)

我不知道如何复制这个崩溃,你有什么想法会导致这样的崩溃吗?

dga*_*ood 6

通常,release() 中的崩溃是由释放无效对象引起的。这可能是由多种原因造成的:

  • 如果您的应用程序是手动内存管理(非 ARC),这可能是由于过度释放对象造成的。
  • 如果存在对对象的非零弱引用(通常在操作系统本身的某些非 ARC 类中),这可能是由于该代码在对象被销毁后释放引用而引起的(尽管这通常会导致 objc_msgSend 崩溃)。
  • 如果您正在操作一个保留对象的变量,并尝试在多个线程中同时更改它而不将该变量标记为原子,则可能会导致这样的事情发生。

奇怪的是,这涉及一个块,它应该在块运行时由队列保留,因此没有手动保留释放错误,除非被释放的对象不是块本身,否则这应该是不可能的。

剩下的是块中包含的对象:

  • 它们中的任何一个是否是双指针,也许(例如 NSError **inOutParam)?如果要在块中使用它们,则需要单独强烈保留块外的那些。
  • 他们中的任何一个都很弱吗?如果是这样,您需要在使用前使它们在块内变强(但我希望这会导致 objc_msgSend 崩溃)。
  • 您是否从多个线程访问任何类型的共享资源(对象、字典、数组)?如果是这样,您是否有适当的同步(对于属性,声明为原子;对于字典或数组,对该字典或数组的所有访问都用 @synchronized 包装)?

显然,没有足够的信息可以肯定地说明您为什么会遇到这次崩溃,但这些是您应该寻找的一些东西。毫无疑问,还有其他一些我没有想到的。

希望有帮助。