【发布时间】: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 {
}
【问题讨论】:
-
CALayer的delegate属性是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