【发布时间】:2011-02-02 09:11:00
【问题描述】:
我在调试 10.6.6 上似乎与 KVO 相关的 EXC_BAD_ACCESS 异常时遇到了一些问题。
我在 CALayer 子类的 position 属性上设置了一个观察者。此特定层是自定义 CALayer 滚动层的内容层。基本上,当用户拖动内容层时,我希望在层的位置更改时发生一些 KVO 通知,以便我可以更新一些自定义 CALayer 滚动条。
以上都可以正常工作。
现在,我在 iOS 中添加了一个橡皮筋效果,这样当用户滚动超过内容区域的限制时,会遇到一些阻力,当用户放开鼠标时,内容层在 x 和 y 维度上快速回到极限位置。垂直回弹就像一个魅力。然而,由于某种奇怪的原因,任何水平的回弹都会导致上述异常发生。
我不明白为什么完全相同的代码路径(垂直回弹与水平回弹)会导致这两种情况的行为不同?这是堆栈跟踪:
CALayerTransactionFlagsLocation_ 中的 0x7fff810bbc2b_
CALayerMark 中的 1 0x7fff810bbe00
propertyDidChange 中的 2 0x7fff810bd394
3 0x7fff810bcbff in endChange
4 0x7fff810bc9f3 in -[CALayer setPosition:]
5 0x100038578 in -[MRContextualScrollLayer scrollDidEnd] at MRContextualScrollLayer.m:280...
scrollDidEnd 是当用户放开鼠标时调用的方法,并执行回弹计算以确定如何重新定位内容层以获得回弹效果。
我尝试通过在 Xcode 中的可执行文件的参数中设置环境变量来打开 NSZombieEnabled,但它没有效果,即没有记录其他信息。这使我相信问题不是内存过度释放问题,即正在访问不应该访问的对象。
scrollDidEnd 方法中导致发布 KVO 通知(然后导致崩溃)的最后一行很简单:
_contentLayer.position = CGPointMake(_contentLayer.position.x + snapBackOffset.x,
_contentLayer.position.y + snapBackOffset.y);
有没有人有任何想法或有用的提示?
【问题讨论】:
标签: objective-c cocoa position calayer key-value-observing