2014-11-24 3 views
4

이상한 문제가 있습니다. 클래스 싱글 톤 인스턴스에 액세스 할 수 있지만 다시 액세스하려고하면 그냥 멈춘 것처럼 보입니다. 여기에 코드의 간단한 버전 :Swift를 사용하여 클래스 싱글 톤에 액세스 할 때 semaphore_wait_trap

private let _SharedInstance = MyManager() 

class MyManager: NSObject { 

    class var sharedInstance: MyManager { 
     return _SharedInstance 
    } 

    override init() { 
     super.init() 

     println("init") 

     println(self.accessToken()) 
     println(MyManager) 
     println("test 1") 
     println(MyManager.sharedInstance) 
     println("test 2") 
    } 

} 

그 자체의 init 내에서 호출되고이 경우는 있지만, 다른 곳에서 발생합니다.

코드는 test 2에 도달하지 않습니다. 즉시 MyManager.sharedInstance에 액세스하면 멈 춥니 다. 오류나 경고가 없습니다.

내가 디버거를 중지하면 내가 현재 semaphore_wait_trap

사진 (차이 클래스 이름)에 데 볼 수 있습니다

Stack trace

다시 시작 엑스 코드 나 컴퓨터가 도움이되지 않았습니다.

+2

교착 상태입니다. –

답변

8

MyManager가 생성되면 잠금이 생성되어 다른 스레드가 변수에 액세스하는 것을 방지합니다. init 메소드 내에서이 변수에 액세스 할 수 없습니다. 단지 이 프로그램을 멈추는 데으로 보이지는 않습니다. 교착 상태가 발생하기 때문에 매번 프로그램이 중단됩니다.

해결책 : init 메소드에서 해당 변수를 사용하지 마십시오. init 메소드에서 _SharedInstance에 직접 또는 간접적으로 액세스하지 마십시오.

+0

감사! 똑똑하고 모든 초기화 로직을'init'에 설정하려했지만, 결국'sharedInstance'에 다시 접근하려했습니다. – rdougan

관련 문제