2016-03-25 1 views
3

Je reçois un bogue intermittent qui s'avère très difficile à déboguer.EXC_BAD_ACCESS (code = 1, adresse = 0x10) sur Core Data Fetch

Je reçois l'erreur suivante de la méthode suivante

EXC_BAD_ACCESS (code = 1, adresse = 0x10) sur base de données 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 
} 

Le bug est extermely intermittent, et ne se produit que sur quelques 100 sessions, mais apparaît assez fréquemment que j'ai besoin d'y faire face. Les pauses de code sur la ligne returnvalue = try context.execute...

  • De débogage, mon fetchRequest n'est pas nil
  • mon context n'est pas nil
  • returnValue a une valeur par défaut d'un tableau vide
  • mon backgroundContext est en cours d'exécution sur un fil d'arrière-plan

J'ai activé NSZombieFlag pour essayer de voir si une certaine mémoire est désallouée ici et puis être consulté, mais je suis perplexe sur ce qui cause cela. Toute idée ou idée serait très appréciée.

+0

Dans la déclaration de capture, vous devez imprimer l'erreur, ce qui peut vous guider dans la bonne direction. Pourriez-vous faire cela et ensuite mettre le message d'erreur dans votre question? En outre, je peux me tromper, mais je suis assez sûr que NSFetchRequest exige que vous fournissiez un NSSortDescriptor. – Jonathan

+0

Le bloc catch n'est jamais atteint, s'il était atteint, le crash ne se produirait pas. J'ai ajouté l'instruction d'erreur dans le bloc catch, mais elle ne l'atteint jamais. Le bloc de capture est là pour empêcher une erreur de récupération de données de base, pas une mauvaise erreur d'accès. – Unome

+0

En ce qui concerne le descripteur de tri requis. Ce n'est définitivement pas. Selon la documentation d'Apple "Une valeur de zéro est traitée comme aucun descripteur de tri" et c'est la valeur par défaut lorsque vous n'en fournissez pas. – Unome

Répondre

3

Presque tous EXC_BAD_ACCESS Problèmes que j'ai vus avec les données de base sont causés par la tentative d'utilisation de la concurrence de threads au lieu du modèle de concurrence de file d'attente plus récent.

Depuis iOS 5, vous devez utiliser performBlock ou performBlockAndWait lors de l'accès à un contexte d'objet géré.

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

+0

D'accord. Core Data et multi-threading peuvent être une douleur totale. –

+0

Je n'ai pas d'autre choix que d'utiliser Core Data et multi-threading. J'utilise la syntaxe suivante. privateContext.performBlock {} – Unome