2011-02-22 3 views
0

내 싱글 톤 클래스에 다음 코드가 있습니다.정적 함수의 이상한 싱글 톤 초기화는 단위 테스트 중에 초기화됩니다.

static MySingleton *gManager; 
+(void)initialize 
{ 
    if(self == [MySingleton class]) 
    { 
     gManager = [[MySingleton alloc] initWithServices:[[MyServices alloc] init]]; 
    } 
} 
+(MySingleton *)sharedInstance 
{ 
    return (gManager); 
} 

불행히도 단위 테스트 중에 gManager가 SenTestCaseRun 유형의 인스턴스라는 것을 알 수 있습니다. 나는 이유를 알아낼 것 같지 않은가? 그래서 [[MySingleton sharedInstance] myFunction]과 같은 호출;

은 MySingleton 클래스에 존재하지만 myFunction이 알 수없는 선택기라는 오류를 발생시킵니다.

NSStringFromClass 함수를 사용했기 때문에 SenTestCaseRun 유형입니다.

모든 포인터? 이미 이것에 3-4 시간 동안 내 머리를 쳤다. (.

+0

이 언어가 어떤 언어인지 모르겠지만 실제로는'C '처럼 보이지 않습니다. – eckes

+0

OP는'objective c'를 태그 상자에 입력했다고 생각합니다. 고쳤다. –

+0

그것은 객관적인 C입니다. 내 태그에 추가했습니다. 어떻게하면 더 명확하게 할 수 있습니까? –

답변

0

+initialize에 중단 점을 넣어이 변수가 올바르게 설정되었는지 확인하십시오. 설명이 없으면 watchpoint을 사용하십시오. 누구를 수정하고 있는지 확인하십시오.

+0

디버거 아래에서 시도해 보았습니다. 전역 매니저가 AudioManager.m에서 호출 스택'# 0in + [AudioManager initialize]을 사용하여 유닛 테스트를 시작할 때만 초기화되었습니다. 118 # 1in _class_initialize # 2in _class_initialize # 3 인치 prepareForMethodLookup # 4 인치 lookUpMethod # 5 인치 _class_lookupMethodAndLoadCache # 6 인치 objc_msgSend # 7 인치 + [NSObject의 (SenTestRuntimeUtilities) senAllSubclasses] #의 8 인치 + [SenTestSuite updateCache] #의 9 인치 + [SenTestSuite suiteForBundleCache] #의 10111 + [SenTestSuite testSuiteForBundlePath :] # 11in + [SenTestProbe specifiedTestSuite] # 12in + [SenTestProb e runTests :]' –

+0

그게 watchpoint에서 온거야? 그 시점에서 올바른 클래스에 할당되었지만 클래스가 잘못되어 나중에 충돌합니다. –

+0

Ok이 문제를 발견했습니다. 나는 앱 종료 중 [[MySingleton sharedInstance] release] 동안 내 싱글 톤을 공개했다. 나중에 참조 할 경우 전역은 런타임에서 설정 한 무작위 인스턴스입니다. 싱글 톤을 릴리스하는 것은 의미가 없지만 일부 리소스를 릴리스해야했습니다. 그래서 코드를 리팩토링했습니다. BTW, 내 코드는 장치에서 잘 작동했지만 단위 테스트는 여러 번 앱 종료 이벤트를 호출했습니다. –

1

그냥 당신이 개체를 비교하는 코드에서

+(MySingleton *)shared 
{ 
    static MySingleton *sharedInstance = nil; 
    if(sharedInstance == nil){ 
     sharedInstance = [[MySingleton alloc] init]; 
    } 
    return sharedInstance; 
} 

또한 공유 인스턴스 메소드 내부의 초기화 코드를 넣어 더 좋을 수 있습니다 [자체 클래스]와 [MySingleton 클래스]를 비교하는 대신 사실이 아닌 클래스

+0

OP 버전의 장점은 스레드 세이프입니다. '+ initialize'와 같은 클래스 메소드에서'self'가 클래스입니다. –