ios 在objc_object::release()中崩溃

3pmvbmvn  于 2023-10-21  发布在  iOS
关注(0)|答案(1)|浏览(124)

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

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

我不知道如何复制这种崩溃,你有任何想法是什么可以导致这样的崩溃?

dsekswqp

dsekswqp1#

通常,release()中的崩溃是由释放无效对象引起的。这可能是由以下几个因素引起的:

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

奇怪的是,这涉及到一个块,它应该在块运行时由队列保留,所以除了手动保留-释放错误,这应该是不可能的,除非被释放的对象是块本身以外的东西(或者除非对该块的最后一次引用以某种方式同时从多个线程并发释放)。
剩下的是包含在你的块中的对象:

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

显然,没有足够的信息来肯定地说为什么你会经历这种崩溃,但这些是你应该寻找的一些东西。毫无疑问,还有一些我没有想到的。
希望能帮上忙。

相关问题