У меня возникла проблема с CoreData, когда NSOperation
, загружающий материал в фоновом режиме, освобождается.Ошибка при освобождении NSOperation в NSManagedObjectContext
Я использую вложенные управляемые контексты объектов и контекст операция использует всё охраняемый в -[NSManagedObjectContext performBlock:]
Однако, по времени операция неоспоримой высвобождена, я получаю аварию со следующим стеком:
#0 0x022d9098 in objc_msgSend()
#1 0x00bfb903 in _PFObjectIDFastHash64()
#2 0x029fbdb0 in __CFDictionaryHashKey()
#3 0x029e13e2 in CFBasicHashFindBucket()
#4 0x029e0e2d in CFDictionaryGetValue()
#5 0x00c0a408 in -[NSPersistentStoreCache incrementRefCountForObjectID:]()
#6 0x00c0a37e in -[NSSQLCore managedObjectContextDidRegisterObjectsWithIDs:]()
#7 0x00cd378c in -[NSPersistentStoreCoordinator(_NSInternalMethods) _informAffectedStoresOfInterestByChildContextInObjectsWithObjectIDs:withSelector:]()
#8 0x00c0a29f in -[NSPersistentStoreCoordinator(_NSInternalMethods) managedObjectContextDidRegisterObjectsWithIDs:]()
#9 0x00cb41db in __95-[NSManagedObjectContext(_NestedContextSupport) managedObjectContextDidRegisterObjectsWithIDs:]_block_invoke_0()
#10 0x00c39cc1 in internalBlockToNSManagedObjectContextPerform()
#11 0x025af014 in _dispatch_client_callout()
#12 0x0259ed5f in _dispatch_barrier_sync_f_invoke()
#13 0x0259eaa3 in dispatch_barrier_sync_f()
#14 0x00c39c8b in _perform()
#15 0x00c3a6e9 in -[NSManagedObjectContext(_NestedContextSupport) managedObjectContextDidRegisterObjectsWithIDs:]()
#16 0x00cb41db in __95-[NSManagedObjectContext(_NestedContextSupport) managedObjectContextDidRegisterObjectsWithIDs:]_block_invoke_0()
#17 0x00c39cc1 in internalBlockToNSManagedObjectContextPerform()
#18 0x025a0731 in _dispatch_barrier_sync_f_slow_invoke()
#19 0x025af014 in _dispatch_client_callout()
#20 0x0259f7d5 in _dispatch_main_queue_callback_4CF()
#21 0x02a12af5 in __CFRunLoopRun()
#22 0x02a11f44 in CFRunLoopRunSpecific()
#23 0x02a11e1b in CFRunLoopRunInMode()
#24 0x02dff7e3 in GSEventRunModal()
#25 0x02dff668 in GSEventRun()
#26 0x0120bffc in UIApplicationMain()
#27 0x0000285d in main at /Users/mochs/Projects/12_IP_Lufthansa_Next/Lufthansa/Supporting Files/main.m:16
#28 0x00002785 in start()
Я действительно понятия не имею, что происходит. То, что я знаю:
- Я использую ARC
- Я с помощью вложенного управляемого объекта контексты
- расписаний операции и выполняют вещи в общем NSThread со своим собственным runloop
- Нити совместно и не освобождаются, когда операция уже высвобождена
- Вскоре после того, как - [NSOperation dealloc] в приложении падает в основном потоке
- я установил тот же вопрос несколько наших, прежде чем с
[context reset]
в методе dealloc NSOperation. В это время типа параллелизм былNSConfinementConcurrencyType
, и я не использовалperformBlock:
- Из-за некоторые изменения мне нужно изменить тип параллелизма в контексте
NSPrivateQueueConcurrencyType
и сделать его использоватьperformBlock:
, теперь ошибка возвращается.
- Из-за некоторые изменения мне нужно изменить тип параллелизма в контексте
Я уверен, что призыв к reset
не реально решить эту проблему, но вместо этого просто фиксируя аварии. Я понятия не имею, что действительно приводит к такой катастрофе.
Кто-нибудь знает, о чем идет речь?
С наилучшими пожеланиями, Майкл
* «Вскоре после этого [NSOperation dealloc] приложение вылетает ...» *. Что это значит? Вы называете dealloc? Если нет, то откуда вы знаете? –
Я установил там точку останова. После этого, похоже, что-то происходит с контекстом основного потока, и он падает. –
Трудно сказать наверняка.Обратный ход выглядит так: 'executeBock:' не выполнялся, и произошел сбой в этом блоке. Вызов 'reset' предположительно отменяет' performBlock: '. Может быть, у вас есть 'performBlock:' где-то, что полагается на очередь операций, которая все еще существует, и сработает, если это не так? –