2016-03-25 6 views
3

Я получаю прерывистую ошибку, которая очень сложно отлаживать.EXC_BAD_ACCESS (code = 1, address = 0x10) on Core Data Fetch

Я получаю следующее сообщение об ошибке из следующего метода

EXC_BAD_ACCESS (код = 1, адрес = 0x10) на Core Data Fetch

class func getAll(context: NSManagedObjectContext) -> [Tag] { 
    var returnValue: [Tag] = [] 
    do { 
     let fetchRequest = NSFetchRequest(entityName: Tag.entityName()) 
     returnValue = try context.executeFetchRequest(fetchRequest) as! [Tag] 
    } catch { 
    } 
    return returnValue 
} 

Буга является extermely прерывистый, и происходит только на каждых нескольких 100 сеансах, но появляется достаточно часто, что мне нужно иметь дело с ним. Кодовые разрывы на линии returnvalue = try context.execute...

  • С отладкой, мой fetchRequest не nil
  • моего context не nil
  • ReturnValue имеет значение по умолчанию пустого массива
  • моего backgroundContext работает на background thread

Я включил NSZombieFlag, чтобы попытаться выяснить, освобождена ли какая-либо память здесь, а затем доступ, но я в тупик о том, что вызывает это. Любые идеи или понимание были бы высоко оценены.

+0

В улове заявлении вы должны распечатать ошибки, которые могут направлять вас в правильном направлении. Не могли бы вы сделать это, а затем поместить сообщение об ошибке в свой вопрос? Кроме того, я могу ошибаться, но я уверен, что NSFetchRequest требует, чтобы вы предоставили NSSortDescriptor. – Jonathan

+0

Блокировка никогда не будет достигнута, если она будет достигнута, авария не произойдет. Я добавил оператор ошибки в блок catch, но он так и не дошел до него. Блокировка блокирует, чтобы предотвратить ошибку выборки данных ядра, а не плохую ошибку доступа. – Unome

+0

Что касается дескриптора сортировки. Его определенно нет. В документации Apple «Значение nil рассматривается как дескрипторы сортировки», и это значение по умолчанию, если вы его не предоставили. – Unome

ответ

3

Почти все EXC_BAD_ACCESS Проблемы, которые я видел с помощью Core Data, вызваны попыткой использования параллелизма потоков вместо новой модели параллелизма очереди.

С iOS 5 вы должны использовать performBlock или performBlockAndWait при доступе к контексту управляемого объекта.

https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CoreData/Concurrency.html

+0

Согласовано. Основные данные и многопоточность могут быть полной болью. –

+0

У меня нет выбора, кроме как использовать Core Data и многопоточность. Я использую следующий синтаксис. privateContext.performBlock {} – Unome