2017-01-24 5 views
3

draw(_:in:)을 사용할 수 있도록 CALayer의 위임을 설정하려고합니다. documentation에는이를 수행하는 방법이 설명되어 있습니다. 그러나 대리자를 설정하자마자 런타임 오류가 발생합니다.CALayer에 대한 델리게이트를 설정하려면 어떻게해야합니까?

Thread 1: EXC_BAD_ACCESS (code=EXC_I386_GPFLT)

다음은 오류를 생성하는 코드입니다. 엑스 코드 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 { 
} 
+2

'CALayer'의'delegate' 속성은'weak'입니다. 그래서 새로운 객체를 설정하면 바로 할당 해제됩니다. 그게 당신의 예외의 근원인지 모르겠지만 ... – Robert

+0

이 답변에 따르면 : http://stackoverflow.com/a/19652248/1179863 EXC_I386_GPFLT는 분명히 "일반 보호 오류"를 말하는 것이고, 이것은 x86의 방법입니다. "너는 네가 할 수없는 일을 했어"라고 말해. 일반적으로 메모리 경계 밖으로 액세스한다는 의미는 아니지만 코드가 범위를 벗어나서 잘못된 코드/데이터가 특정 유형의 보호 위반을 초래하는 방식으로 사용되는 것일 수 있습니다. –

+1

당신은 클래스 ViewController를 시도 했습니까? UIViewController {let layerDelegate = LayerDelegate()는 func viewDidLoad() {... myLayer.delegate = layerDelegate}}'를 재정의합니까? – Yannick

답변

2

개체가 메모리에서 제거됩니다. 다른 @Robert가 지적한 것처럼 CALayerdelegateweak이고 범위를 벗어나면 viewDidLoad() 함수는 개체를 메모리에서 제거합니다.

해제되지 않았는지 확인해야합니다. 클래스에 속성을 추가 할 수 있습니다. 이것은 수업이 살아있는 한 계속 살 것입니다.

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