我有一个堆栈跟踪显示响应内存警告的崩溃:
Thu Oct 28 00:42:55 iPhone DTMobileIS[10853] : _memoryNotification : {name = (null), num = 1} Thu Oct 28 00:42:55 iPhone DTMobileIS[10853] : _memoryNotification : { OSMemoryNotificationLevel = 1; timestamp = "2010-10-28 07:42:55 GMT"; } Thu Oct 28 00:42:55 iPhone MyApp[11059] : Received memory warning. Level=1 Thu Oct 28 00:42:55 iPhone MyApp[11059] : -[__NSCFType tryLock]: unrecognized selector sent to instance 0x41bfd0 Thu Oct 28 00:42:55 iPhone MyApp[11059] : *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFType tryLock]: unrecognized selector sent to instance 0x41bfd0' *** Call stack at first throw: ( 0 CoreFoundation 0x30897ed3 __exceptionPreprocess + 114 1 libobjc.A.dylib 0x3002f811 objc_exception_throw + 24 2 CoreFoundation 0x30899683 -[NSObject(NSObject) doesNotRecognizeSelector:] + 102 3 CoreFoundation 0x308411d9 ___forwarding___ + 508 4 CoreFoundation 0x30840f90 _CF_forwarding_prep_0 + 48 5 CoreData 0x316cc261 -[_NSSQLCoreConnectionObsever _purgeCaches:] + 124 6 Foundation 0x349bb6b3 _nsnote_callback + 142 7 CoreFoundation 0x3081e713 __CFXNotificationPost_old + 402 8 CoreFoundation 0x3081e3b3 _CFXNotificationPostNotification + 118 9 Foundation 0x349aadb7 -[NSNotificationCenter postNotificationName:object:userInfo:] + 70 10 Foundation 0x349b42d1 -[NSNotificationCenter postNotificationName:object:] + 24 11 UIKit 0x31ed9431 -[UIApplication _performMemoryWarning] + 48 12 UIKit 0x31ec7383 -[UIApplication _receivedMemoryNotification] + 126 13 UIKit 0x31ec72c7 _memoryStatusChanged + 42 14 CoreFoundation 0x3084e825 __CFNotificationCenterDarwinCallBack + 24 15 CoreFoundation 0x30835313 __CFMachPortPerform + 210 16 CoreFoundation 0x3082cce3 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 26 17 CoreFoundation 0x3082cca7 __CFRunLoopDoSource1 + 166 18 CoreFoundation 0x3081f56d __CFRunLoopRun + 520 19 CoreFoundation 0x3081f277 CFRunLoopRunSpecific + 230 20 CoreFoundation 0x3081f17f CFRunLoopRunInMode + 58 21 GraphicsServices 0x31e445f3 GSEventRunModal + 114 22 GraphicsServices 0x31e4469f GSEventRun + 62 23 UIKit 0x31e51123 -[UIApplication _run] + 402 24 UIKit 0x31e4f12f UIApplicationMain + 670 25 MyApp 0x00052c81 main + 72 26 MyApp 0x00002f18 start + 52 )
我不确定核心数据正在做什么,它试图从这个对象获取锁定,但我觉得这表明我的代码中某处出现了线程问题。
有人能想出调试这个或可能的根本原因的好方法吗?
答案 0 :(得分:2)
我最近碰到了这个并找到了解决方案。该错误在Core Data本身中,并在iOS 5.1之前的版本中显示(它似乎在该版本中修复)。
当持久性存储协调器(PSC)无法加载给定的持久性存储(例如因为架构已更改)时,会发生崩溃。在这种情况下,即使没有外部访问权限,失败的存储仍会显示为添加到内部Core Data缓存中。然后,当应用程序处于后台运行或某些内存压力情况时,Core Data会自动刷新此缓存。一切都很好,除非你用来尝试加载失败的商店的PSC已被解除分配,在这种情况下,缓存将尝试访问它并给出上述错误。
因此,总而言之,在这种情况下你会遇到这个错误:
要解决此问题,有两种选择。我选择在调用-addPersistentStoreWithType失败的情况下不释放PSC:配置:URL:options:error:,在这种情况下,缓存清除仍将访问有效的PSC。另一种方法是使用以下两个调用来抢先检查模型架构是否与磁盘持久性存储的方案匹配:
+[NSPersistentStore metadataForPersistentStoreWithURL:error:]
-[NSManagedObjectModel isConfiguration:compatibleWithStoreMetadata:]
第二种解决方案可能会避免在某些极少数情况下泄漏PSC,但也假设持久存储无法加载的唯一可能方式是由于模型架构不匹配。
答案 1 :(得分:1)
我实际上发现,经过一些代码分析后,其根本原因似乎是与CoreData交叉线程。我有一个来自操作队列的后台线程,操作源自主线程的NSManagedObjectContext(并导致了一个保存!哎!)。
经过一些操作后,如果我在模拟器中发送内存警告,应用程序就会崩溃。