如何为 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 指出的那样,CALayer
的 delegate
是 weak
,一旦离开范围,即 viewDidLoad()
函数,对象就会从内存中删除。
您需要确保它没有被释放。您可以将 属性 添加到您的 class。只要 class 存在,它就会存在。
class ViewController: UIViewController {
let layerDelegate = LayerDelegate()
override func viewDidLoad() {
super.viewDidLoad()
let myLayer = CALayer()
myLayer.delegate = layerDelegate
view.layer.addSublayer(myLayer)
}
}
我正在尝试设置 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 指出的那样,CALayer
的 delegate
是 weak
,一旦离开范围,即 viewDidLoad()
函数,对象就会从内存中删除。
您需要确保它没有被释放。您可以将 属性 添加到您的 class。只要 class 存在,它就会存在。
class ViewController: UIViewController {
let layerDelegate = LayerDelegate()
override func viewDidLoad() {
super.viewDidLoad()
let myLayer = CALayer()
myLayer.delegate = layerDelegate
view.layer.addSublayer(myLayer)
}
}