Вопрос по swift, exc-bad-access, dictionary, ios – EXC_BAD_ACCESS при обновлении словаря Swift после использования его для оценки выражения NSExpression

8

Я использую словарь для оценки выражения, когда выражение имеет переменные и словарь фактически используется NSExpression, что-то происходит, и я получаю EXC_BAD_ACCESS при попытке обновить словарь, это происходит только при отладке в iPhone6, а не в симулятор а не в айфон 4с.

    let strExpression = "a+b+20"
    let exp = NSExpression(format:strExpression)
    self.dictionary = ["a":10.0, "b":15.0, "c":25.0]
    let value:AnyObject = exp.expressionValueWithObject(self.dictionary, context: nil)
    let doubleValue = value as Double
    self.dictionary.updateValue(doubleValue, forKey: "c")    

Что-то действительно странное в том, что, если я добавлю эту строку сразу после создания словаря, то все будет хорошо:

let newDic = self.dictionary    

Я использую iOS 8.1. Заранее спасибо!

Спасибо @juanelomx !!! Тот же баг и хак сlet помог мне Aznix
@bensarz Я добавил ответ ниже, чтобы помочь тем, кто ищет ответы. steventnorris
Похоже, @steventnorris должен получить очки за отправку ОП на правильный ответ. bsarrazin
Я верю, что сейчас найдено надежное решение. Я добавил решение в свой ответ. Это ошибка уровня оптимизации компилятора. steventnorris

Ваш Ответ

1   ответ
0

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

Ответ Per @ LeeWhitney на аналогичный пост:

Похоже, ошибка компилятора.

Вы пробовали переключаться между Release и Debug, а затем перестраивать? Если отладка работает, но не выпускается, это может указывать на ошибку компилятора / оптимизатора.

Это происходит и в симуляторе?

Ваш код работает для меня на iOS 8.1 с XCode 6.1.

Решение: Кажется, проблема решена путем изменения уровня оптимизации в «Swift Compiler - Generation» на «Нет». Похоже, проблема связана с «самым быстрым» уровнем оптимизации компилятора.

Кроме того, обходной путь, который я нашел оригинальным до изменения компилятора:

Если вы используете оператор let до присвоения значений в словаре, это, похоже, облегчает проблему. Более подробную информацию можно найти по ссылке ниже:

EXC_BAD_ACCESS на iOS 8.1 со словарем

Похожие вопросы