Следующая строка кода приводит к тому, что моя программа ломается очень странным образом ...
id foo = (id)0xbfffe8d0;
Тем не менее, это не проблема:
int foo = (int)(id)0xbfffe8d0;
И даже этонет проблем:
int magicAddr = 0xbfffe8d0;
id foo = (id)magicAddr;
WTF?
Простая вставка этой строки кода в определенный метод init приводит к сбою моей итерации через массив с "NSGenericException: Collection был изменен во времяперечисляются ".Комментирование строки приводит к исключению исключения.Этот код является однопоточным.Поведение является детерминированным и постоянно воспроизводится снова и снова и постоянно не воспроизводится, когда я комментирую строку.«foo» - это выдуманная переменная, на которую больше не ссылаются.Никакой другой код не ссылается на «foo».
Есть ли у этой строки побочный эффект?Имеет ли приведение числа к (id) побочный эффект?
Подробнее о том, что я делал:
- Я запустил NSLog (@ "self =% p, super=% p ", self, super) и распечатал" self = 0xa83dc50, super = 0xbfffe8d0 ", что заставило меня задать этот вопрос
- У меня есть _NO_IDEA_, что это значение 0xbfffe8d0 илиозначает.
- Вставленная мною строка находится внутри метода init2 для класса, имеющего ссылку на NSEnumerator в коллекции, которая выдает исключение.Класс НЕ изменяет коллекцию и даже не имеет ссылки на коллекцию.
Точный код: (удален, не актуален или интересен)
OKтак что я до сих пор не могу объяснить поведение выше.Я не могу объяснить, почему 4-байтовое int в стеке в порядке, но 4-байтовое «id» - это крах.Но я запускал этот код несколько сотен раз, помещая все помехи случайного дерьма, и я мог вызывать сбои с другими значениями и утверждениями.Всегда детерминированный, но нет четкого или объяснимого шаблона для вещей, которые рухнули против вещей, которые этого не сделали.Биззари, но не главная проблема.
Реальная проблема? Коллекция была от [NSThread callStackSymbols].Это возвращает _NSCallStackArray.Вот где живет настоящая Зебра.В этой псевдосборке есть что-то странное, но я не могу точно сказать, что именно.
Исправление?
[NSArray arrayWithArray: [NSThread callStackSymbols]]
С исправлением нет комбинациислучайное дерьмо в моем коде вызовет сбой перечисления.Так что будьте осторожны.Если вы планируете возвращать символы стека вызовов и рассматривать их как массив, СДЕЛАЙТЕ КОПИЮ.
Урок? Если вы вызываете [NSThread callStackSymbols] и хотите трактовать результат какмассив, сделать копию и получить реальный массив.Остальное .... "там будут драконы" !!