2017-01-24 3 views
3

Я пытаюсь установить делегата 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 { 
} 
+2

Свойство 'delegate'' CALayer' '' слабое ', поэтому установка нового объекта, подобного ему, приведет к немедленному освобождению. Не уверен, что это источник вашего исключения, хотя ... – Robert

+0

в соответствии с этим ответом: http://stackoverflow.com/a/19652248/1179863 EXC_I386_GPFLT, безусловно, имеет в виду «Общая ошибка защиты», которая является способом x86 скажите, что «вы сделали то, что вам не разрешено». Это, как правило, НЕ означает, что вы получаете доступ к границам памяти, но может быть, что ваш код выходит за рамки и приводит к неправильному использованию кода/данных таким образом, который делает нарушение какой-либо защиты. –

+1

Вы попробовали 'class ViewController: UIViewController {let layerDelegate = LayerDelegate() переопределить func viewDidLoad() {... myLayer.delegate = layerDelegate}}'? – Yannick

ответ

2

объекта удаляются из памяти, потому что нет сильной ссылки на него. Как заметил другой @Robert, delegate - weak, и как только вы покинете область действия, которая является функцией viewDidLoad(), объект будет удален из памяти.

Вам необходимо убедиться, что он не освобожден. Вы можете добавить свойство в свой класс. Это будет жить до тех пор, пока класс живет.

class ViewController: UIViewController { 
    let layerDelegate = LayerDelegate() 
    override func viewDidLoad() { 
     super.viewDidLoad() 
     let myLayer = CALayer() 
     myLayer.delegate = layerDelegate 
     view.layer.addSublayer(myLayer) 
    } 
} 
Смежные вопросы