【问题标题】:How can I set a delegate for a CALayer?如何为 CALayer 设置委托?
【发布时间】:2017-01-24 12:47:47
【问题描述】:

我正在尝试设置CALayer 的委托,以便我可以使用draw(_:in:)documentation 描述了如何做到这一点。但是一旦我设置了委托,就会出现运行时错误:

线程 1:EXC_BAD_ACCESS(代码=EXC_I386_GPFLT)

这是产生错误的代码。在 Xcode 8.2.1 的 Single View Application 模板中替换 ViewController.swift

import UIKit
class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        let myLayer = CALayer()
        myLayer.delegate = LayerDelegate()
        view.layer.addSublayer(myLayer)
    }
}

class LayerDelegate: NSObject, CALayerDelegate {
}

【问题讨论】:

  • CALayerdelegate 属性是weak,所以给它设置一个这样的新对象会导致它立即释放。不过,不确定这是否是您的异常的根源......
  • 根据这个答案:stackoverflow.com/a/19652248/1179863 EXC_I386_GPFLT 肯定是指“一般保护错误”,这是 x86 告诉您“您做了不允许做的事情”的方式。这通常并不意味着您访问超出内存范围,但可能是您的代码超出范围并导致错误的代码/数据以某种方式使用,从而导致某种保护违规。跨度>
  • 你试过class ViewController: UIViewController { let layerDelegate = LayerDelegate() override func viewDidLoad() { ... myLayer.delegate = layerDelegate }}吗?
  • 文档示例将委托保存到属性内的强引用中。也许这是一个先决条件,weak 引用实际上是 unowned 引用,因此您会因为委托被释放而崩溃。
  • @Yannick 成功了。谢谢!我做了一个答案,但如果你创建自己的答案,我会接受你的。

标签: ios swift delegates swift3 calayer


【解决方案1】:

该对象从内存中删除,因为没有对它的强引用。正如另一个@Robert 指出的那样,CALayerdelegateweak,一旦你离开范围,即viewDidLoad() 函数,该对象就会从内存中删除。

您需要确保它没有被释放。您可以将属性添加到您的类。只要类存在,它就会存在。

class ViewController: UIViewController {
    let layerDelegate = LayerDelegate()
    override func viewDidLoad() {
        super.viewDidLoad()
        let myLayer = CALayer()
        myLayer.delegate = layerDelegate
        view.layer.addSublayer(myLayer)
    }
}

【讨论】:

    猜你喜欢
    • 2011-01-02
    • 1970-01-01
    • 1970-01-01
    • 2011-05-19
    • 2019-12-18
    • 1970-01-01
    • 2013-07-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多