Coredata 在 iOS 16 上崩溃,在 -[_PFManagedObjectReferenceQueue _processReferenceQueue:] 中过度发布

Coredata crash on iOS 16, over-release in -[_PFManagedObjectReferenceQueue _processReferenceQueue:]

提问人:nghiahoang 提问时间:2/7/2023 更新时间:2/7/2023 访问量:152

问:

我们在 iOS16 上遇到了一个奇怪的问题。没有代码更改,它在较低的操作系统版本上运行良好。 堆栈跟踪为:

  • 第一种情况


Crashed: com.apple.main-thread
EXC_BAD_ACCESS KERN_INVALID_ADDRESS 0x00000000e5bde410
0
libobjc.A.dylib
objc_release_x21 + 16
1
CoreData
-[_PFManagedObjectReferenceQueue _processReferenceQueue:] + 1020
2
CoreData
-[NSManagedObjectContext _processRecentChanges:] + 112
3
CoreData
_performRunLoopAction + 412
4
CoreFoundation
__CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 36
5
CoreFoundation
__CFRunLoopDoObservers + 532
6
CoreFoundation
__CFRunLoopRun + 1048
7
CoreFoundation
CFRunLoopRunSpecific + 612
8
GraphicsServices
GSEventRunModal + 164
9
UIKitCore
-[UIApplication _run] + 888
10
UIKitCore
UIApplicationMain + 340
  • 第二种情况,我相信这个堆栈跟踪的根本原因与前一个相同(相同的趋势,相同的 UI 页面,只发生在 iOS 16 上)。
Crashed: com.apple.main-thread
EXC_BAD_ACCESS KERN_INVALID_ADDRESS 0x0033003200390070
0
libobjc.A.dylib
objc_msgSend + 32
1
CoreFoundation
-[__NSArrayM dealloc] + 188
2
MyApplication
MyClass.m - Line 361
-[MyClass loadMessages:] + 361
3
MyApplication
MyClass.m - Line 125
__74-[MyClass requestRecentMessagesAndDiscardExistingMessagesCompletion:]_block_invoke + 125
4
libdispatch.dylib
_dispatch_call_block_and_release + 32
5
libdispatch.dylib
_dispatch_client_callout + 20
6
libdispatch.dylib
_dispatch_main_queue_drain + 928
7
libdispatch.dylib
_dispatch_main_queue_callback_4CF + 44
8
CoreFoundation
__CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 16
9
CoreFoundation
__CFRunLoopRun + 2036
10
CoreFoundation
CFRunLoopRunSpecific + 612
11
GraphicsServices
GSEventRunModal + 164
12
UIKitCore
-[UIApplication _run] + 888
13
UIKitCore
UIApplicationMain + 340

MyClass.m是一个 Objective-C 类,它有一个属性:

@property (nonatomic, strong) NSArray<Message *> *messages; // Message is NSManagedObject

在第二个堆栈跟踪 frame 中,数组被解除分配:-[OurClass loadMessages:] + 361messages

self.messages = [[NSArray alloc] init...];

所以我的猜测是,不知何故,消息被过度释放了。如果消息是在之前发布的,则崩溃将作为第一个堆栈跟踪发生,否则将作为第二个堆栈跟踪发生。MyClass

我已经打开尝试调试它,但没有运气。-com.apple.CoreData.ConcurrencyDebug 1

任何帮助将不胜感激。提前致谢!

ios objective-c core-data 崩溃 ios16

评论


答: 暂无答案