Подтвердить что ты не робот

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

У меня есть объект, доступный через статический var в структуре (обходной путь для отсутствия поддержки переменных класса в swift прямо сейчас), структурированный следующим образом:

struct Constants{
    static var myObj = MyObject()
}

В MyObject есть словарь в нем так:

class MyObject{
    private var params = Dictionary<String,AnyObject>()

    func addParam(key:String, value:AnyObject){
        params[key] = value
    }
}

Теперь при первом вызове этого объекта для Contants.myObj.addParam("param", value:123) все хорошо, а params имеет содержимое ["param":123]. Во втором вызове Contants.myObj.addParam("param", value:456) я получаю EXC_BAD_ACCESS.

Здесь, однако, кикер, это происходит только в iOS 8.1. Кроме того, если я добавлю строку let stupidHack = self.params в качестве первой строки моего метода addParam, она отлично работает. Мое предположение заключается в том, что оно касается изменчивости словарей. Пусть let может каким-то образом заставить словарь быть изменчивым снова после инициализации.

Кто-нибудь еще сталкивается с этой проблемой раньше? Любая идея о том, как его исправить?

Спасибо!

4b9b3361

Ответ 1

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

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

Случается ли это и в симуляторе?

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

Ответ 2

Если у вас есть iPhone 6 с 64Gb? У меня есть один, и у меня была такая же проблема, что и словари дважды.

В новостях (ну технические новости...) я читал, что дефектные модули памяти, поставляемые Toshiba для именно этой модели iPhone, могут вызвать неправильные выделения в памяти.

Ответ 3

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

Ответ 4

Попробуйте настроить уровень оптимизации компилятора Swift на "Нет" ( "Настройки сборки" ).

У меня была аналогичная проблема, когда класс был освобожден без видимой причины, в основном это ошибка компилятора, как сказал Ли.