如何为 CALayer 设置委托?

How can I set a delegate for a CALayer?

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

Thread 1: EXC_BAD_ACCESS (code=EXC_I386_GPFLT)

这是生成错误的代码。在 Xcode 8.2.1:

中替换单视图应用程序模板中的 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 {
}

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

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

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