2015-10-01 3 views
4

Я унаследовал некоторый быстрый код, который выполняет refreshObject сразу после получения данных ядра. Выбранные объекты имеют отношение к другой таблице. Объект fetch и refreshObject находится внутри executeBlockAndWait. Код ниже. Сбой, похоже, начался в iOS9.EXC_BAD_ACCESS в NSManagedObjectContext refreshObject

  • Любая идея, почему refreshObject бросает EXC_BAD_ACCESS? Что такое исправление?
  • Какова цель создания refreshObject сразу после извлечения? Эта таблица содержит всего несколько строк. Это необходимо? Любой недостаток, чтобы удалить все вместе?

    context.performBlockAndWait { 
        let className = self.className() 
        let fetchRequest = NSFetchRequest(entityName: className) 
        groups = (try? context.executeFetchRequest(fetchRequest)) as? [FavoriteLocationGroup] 
        if groups != nil { 
         groups!.sortInPlace { $0.name < $1.name } 
         for group in groups! { 
          context.refreshObject(group, mergeChanges: false) <<< crashes here 
         } 
        } 
    } 
    

Заранее спасибо за любую помощь вы можете предоставить!

value of context

what group is

+0

это скоро не ObjC;) фиксированный вопрос и теги –

+0

что значение контекст, когда вы вызываете обновление –

+0

и что такое группа. и есть ли у вас наблюдатель уведомления, который реагирует на слияние? –

ответ

6

Не могли бы вы попробовать заменить sortInPlace линию

groups = groups!.sort { $0.name < $1.name } 

Я ударил подобный вопрос. Приложение вызвало сбой в режиме Release в случайном месте после вызова sortInPlace. Похоже, что это приводит к некоему повреждению памяти. sort() работает хорошо.

Upd: Я был в состоянии воспроизвести аварии со следующим кодом (также аварий в OS X Cocoa приложениях):

import Cocoa 

class MyObject { 
    var x: Int? 
} 

@NSApplicationMain 
class AppDelegate: NSObject, NSApplicationDelegate { 

    @IBOutlet weak var window: NSWindow! 

    var array = [MyObject]() 

    func applicationDidFinishLaunching(aNotification: NSNotification) { 
     // Insert code here to initialize your application 

     for x in 0..<100000 { 
      let object = MyObject() 
      object.x = x 
      array.append(object) 
     } 
     array.sortInPlace { $0.x < $1.x } // CRASH 
    } 
    ... 
} 
Смежные вопросы