【问题标题】:Swift : animator() causes EXC_BAD_ACCESSSwift : animator() 导致 EXC_BAD_ACCESS
【发布时间】:2014-08-20 22:19:00
【问题描述】:

我注意到自 beta 5 以来在 OS X 10.10 下隐式动画的一些奇怪行为。 调用动画代理有时会导致应用崩溃。我设置了一个非常简单的自定义视图。这是完整的代码:

import Cocoa
import QuartzCore

class AnimatedView: NSView {

    var firstColor: NSColor = NSColor.blackColor() {
        didSet {
           self.needsDisplay = true
        }
    }

    var secondColor: NSColor = NSColor.whiteColor() {
        didSet {
            self.needsDisplay = true
        }
    }

    override func drawRect(dirtyRect: NSRect) {
        super.drawRect(dirtyRect)

        let outerRect = self.bounds
        let halfW = outerRect.width / 4.0
        let halfH = outerRect.height / 4.0
        var innerRect = outerRect
        innerRect.inset(dx: halfW, dy: halfH)
        self.firstColor.set()
        NSRectFill(outerRect)
        self.secondColor.set()
        NSRectFill(innerRect)
    }

    override func animationForKey(key: String!) -> AnyObject! {
        switch key {
        case "firstColor", "secondColor" :
            return CABasicAnimation()
        default :
            return super.animationForKey(key)
        }
    }
}

如果我尝试为 NSView 的 ans 祖先的属性设置动画,一切都会像魅力一样工作。如:

animView.animator().frame = someFrame

如果我尝试为 AnimatedView 的属性(例如 firstColor 或 secondColor)设置动画:

animView.animator().firstColor = someColor
animView.animator().secondColor = someOtherColor

它因各种错误代码而崩溃(两次尝试之间代码没有变化):

  • EXC_BAD_ACCESS(代码=EXC_386_GPFLT)
  • EXC_BAD_ACCESS(代码=1,地址=0x...)
  • EXC_BAD_ACCESS(代码=2,地址=0x...)(地址通常为 0x0)

没有对象是 Nil(我检查了两次)。

有时它会抱怨 __CFString,有时它只是在没有更改代码的情况下崩溃,但它从不工作......

我认为这是某种错误,但在报告之前我必须确定,也许我忘记了什么。

【问题讨论】:

    标签: animation swift


    【解决方案1】:

    重新阅读发行说明,注意到动态关键字,测试它,工作! 因此,如果您想为自定义属性设置动画,则必须在属性声明中使用 dynamic 关键字:

    dynamic var firstColor: NSColor = NSColor.blackColor() {
        didSet {
            self.needsDisplay = true
        }
    }
    
    dynamic var secondColor: NSColor = NSColor.whiteColor() {
        didSet {
            self.needsDisplay = true
        }
    }
    

    我不知道为什么它在 beta 5 之前有效,我不知道它是临时解决方法还是 正常 使用它的方式,但它工作得很好.

    【讨论】:

    • 更新:对于 Swift 4,属性也必须用@objc 属性标记,即@objc dynamic var firstColor ...
    猜你喜欢
    • 2014-11-05
    • 1970-01-01
    • 1970-01-01
    • 2012-07-27
    • 2016-11-19
    • 2012-10-02
    • 2011-04-14
    • 2017-03-15
    • 2014-09-27
    相关资源
    最近更新 更多