У меня возникли проблемы с отладкой того, что похоже на исключение EXC_BAD_ACCESS, связанное с KVO, в 10.6.6.
Я установил наблюдателя для свойства position подкласса CALayer. Этот конкретный слой является слоем контента для пользовательского слоя прокрутки CALayer. По сути, когда пользователь перетаскивает слой контента, мне бы хотелось, чтобы при изменении положения для слоя появлялись уведомления KVO, чтобы я мог обновить некоторые пользовательские скроллеры CALayer.
Выше все отлично работает.
Теперь я добавил эффект резиновой ленты в виде iOS, так что когда пользователь прокручивает границы области содержимого, возникает некоторое сопротивление, и когда пользователь отпускает мышь, слой содержимого привязывается к предельному положению в измерениях x и y. Вертикальная оснастка работает как шарм. Однако по какой-то причудливой причине любая горизонтальная привязка приводит к возникновению вышеуказанного исключения.
Что я не понимаю, так это то, почему точно один и тот же путь кода (вертикальная обратная или горизонтальная обратная) может привести к тому, что эти две ситуации будут вести себя по-разному? Вот трассировка стека:
0 0x7fff810bbc2b в CALayerTransactionFlagsLocation_
1 0x7fff810bbe00 в CALayerMark
2 0x7fff810bd394 в свойствоDidChange
3 0x7fff810bcbff в endChange
4 0x7fff810bc9f3 in - [CALayer setPosition:]
5 0x100038578 в - [MRContextualScrollLayer scrollDidEnd] в MRContextualScrollLayer.m: 280
...
scrollDidEnd - это метод, который вызывается, когда пользователь отпускает мышь, и выполняется расчет возврата, чтобы определить, как изменить положение слоя содержимого для эффекта возврата.
Я попытался включить NSZombieEnabled, задав переменную окружения в аргументах исполняемого файла в XCode, но это не имеет никакого эффекта, то есть дополнительная информация не регистрируется. Это заставляет меня поверить, что проблема не в переполнении памяти, когда к объекту обращаются, чего не должно быть.
Последняя строка в методе scrollDidEnd, которая приводит к публикации уведомления KVO (что затем приводит к сбою), просто:
_contentLayer.position = CGPointMake(_contentLayer.position.x + snapBackOffset.x,
_contentLayer.position.y + snapBackOffset.y);
У кого-нибудь есть идеи или полезные советы?