Я пытаюсь установить делегата CALayer
, чтобы использовать draw(_:in:)
. documentation описывает, как это сделать. Но как только я установил делегата, произошла ошибка времени выполнения:Как установить делегат для CALayer?
Thread 1: EXC_BAD_ACCESS (code=EXC_I386_GPFLT)
Вот код, который генерирует ошибку. Заменить ViewController.swift
в шаблоне Single View Application в Xcode 8.2.1:
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let myLayer = CALayer()
myLayer.delegate = LayerDelegate()
view.layer.addSublayer(myLayer)
}
}
class LayerDelegate: NSObject, CALayerDelegate {
}
Свойство 'delegate'' CALayer' '' слабое ', поэтому установка нового объекта, подобного ему, приведет к немедленному освобождению. Не уверен, что это источник вашего исключения, хотя ... – Robert
в соответствии с этим ответом: http://stackoverflow.com/a/19652248/1179863 EXC_I386_GPFLT, безусловно, имеет в виду «Общая ошибка защиты», которая является способом x86 скажите, что «вы сделали то, что вам не разрешено». Это, как правило, НЕ означает, что вы получаете доступ к границам памяти, но может быть, что ваш код выходит за рамки и приводит к неправильному использованию кода/данных таким образом, который делает нарушение какой-либо защиты. –
Вы попробовали 'class ViewController: UIViewController {let layerDelegate = LayerDelegate() переопределить func viewDidLoad() {... myLayer.delegate = layerDelegate}}'? – Yannick