2016-03-25 19 views
3

Hata ayıklamak için çok zor olduğunu belirten aralıklı bir hata alıyorum.EXC_BAD_ACCESS (kod = 1, adres = 0x10)

Ben

EXC_BAD_ACCESS (kod = 1, adres = 0x10) Çekirdek Veri üzerinde

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 
} 

böcek Fetch aşağıdaki yönteminden aşağıdaki hatayı alıyorum, extermely aralıklı olduğu ve sadece her birkaç 100 seansta gerçekleşiyor, ama bununla başa çıkmam gereken kadar sık ​​gözüküyor. on line kod sonları returnvalue = try context.execute... ayıklama itibaren

  • , benim fetchRequestnil
  • değil benim context değil nil
  • returnValue
  • benim backgroundContext bir çalışıyorsa boş dizinin varsayılan değere sahiptir Arka plan iş parçacığı

NSZombieFlag'i açtım, bazı bellekler ayrılmışsa da burada ve daha sonra erişiliyor, ama buna neden olan şey üzerinde güldüm. Herhangi bir fikir veya içgörü çok takdir edilecektir.

+0

. Bunu yapabilir ve sonra hata mesajını sorunuza koyabilir misiniz? Ayrıca, hatalı olabilirim, ancak NSFetchRequest'in bir NSSortDescriptor sağlamanızı gerektirdiğinden eminim. – Jonathan

+0

Yakalama bloğuna asla ulaşılamıyor, eğer ulaşılmışsa, çökme oluşmaz. Hata bildirimini catch bloğuna ekledim, ancak yine de ona ulaşmıyor. Yakalama bloğu, kötü bir erişim hatası değil, bir çekirdek veri getirme hatasını önlemek içindir. – Unome

+0

Sıralama tanımlayıcısı gerekli. Kesinlikle değil. Apple'ın belgelerine göre "Bir nil değeri, sıralama tanımlayıcısı olarak kabul edilmez" ve bir sağlamadığınız zaman bu varsayılan değerdir. – Unome

cevap

3

Neredeyse tüm EXC_BAD_ACCESS sorunları, Çekirdek Veriler ile gördüğüm daha yeni sıra eşzamanlılık modeli yerine iş parçacığı eşzamanlılığını kullanmaya çalışmasından kaynaklanıyor.

iOS 5'ten bu yana, yönetilen bir nesne bağlamına erişirken performBlock veya performBlockAndWait'u kullanmanız gerekir. Eğer doğru yönde size rehberlik edebilir hata, yazdırmalısınız yakalamak açıklamada

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

+0

Anlaşmalı. Çekirdek Veriler ve çoklu iş parçacığı toplam acı olabilir. –

+0

Çekirdek Verileri ve çoklu iş parçacıklarını kullanmaktan başka çarem yok. Aşağıdaki sözdizimini kullanıyorum. privateContext.performBlock {} – Unome