2012-03-29 4 views
2

런타임시 매핑 - 문자열 매핑이 필요합니다 (생각하면 NSDictionary). 단, 빌드 타임 이후에는 매핑이 변경되지 않습니다.정적 문자열 -> 문자열 매핑

순진한 해결책은 NSDictionary을 사용하는 것이지만 더 최적의 방법이 있어야합니다. 그렇지 않습니다.

매핑이 컴파일 타임에 알려지고 변경되지 않는 것으로 알려진 경우 컴파일러는 컴파일시 매핑을 수행 할 수 있어야합니다. NSDictionary는 런타임에 해시 조회를 수행해야합니다. 나는 그것이 일정한 시간이라는 것을 알고 있지만, 내게 조금 "부정하다"고 느낀다.

+1

"최적의"의미는 무엇입니까? NSDictionary에 성능 문제가 있습니까? 아니면 NSDictionary가 있어야한다고 가정하고 있습니까? – Caleb

+0

"최적"이라는 말의 의미를 명확히하기 위해 내 질문이 업데이트되었습니다. – elsurudo

+0

첫 번째 문장에서 매핑을 "런타임에 사용"하면 컴파일러는 컴파일 타임에 매핑을 어떻게 수행합니까? 해결하려는 문제에 대해 설명해 주시겠습니까? – Caleb

답변

1

정적 인 NSDictionary이 이에 적합한 도구입니다. 당신은 일반적으로 +initialize 방법이 초기화 :

static NSDictionary *kDictionary; 

+ (void)initialize { 
    if (self == [MYClass class]) { 
    kDictionary = [[NSDictionary alloc] initWith...]; 
    } 
} 

initialize 클래스에 한 번이라고, 스레드 안전을 첫 번째 요청 방법은 그 클래스에서 호출되기 직전에 (일반적으로이 첫 번째 방법은 +alloc입니다). self 테스트는 하위 클래스가 자동으로 [super initialize]을 호출하므로 일반적으로이 경우 두 번 이상 실행하지 않으려 고합니다.

+0

초기화에'dispatch_once()'가드를 사용하지 않는 이유가 있습니까? 이것은 의도 한도에 더 부합하는 것으로 보이며 하위 클래스가 사전을 사용할 수 있도록 허용합니다 (이 클래스 중 하나가이 클래스보다 먼저 사용되는 경우). –

+0

어디에서'dispatch_once()'를 넣을까요? 'init'에 넣을 수 있습니다 만,'initWithCoder :'를 사용하여 객체를 생성하면 어떻게 될까요? 사전에 의존하는 클래스 메소드가있는 경우, 최초의'init'보다 먼저 호출 될 수 있습니까? '+ 초기화 '는 이러한 모든 코너 케이스를 처리하므로 미묘하고 어려운 버그는 피할 수 있습니다. 인스턴스 메소드에서 클래스 초기화를하는 것은 좋지 않습니다. 클래스 메쏘드에서 그렇게한다면, 적절한 시간에 자동으로 호출되는'+ initialize'를 왜 사용하지 않을까요? –

+0

내 의견을 다시 읽으면서 지금 내게는 분명하지 않은 것처럼 보입니다. 죄송합니다,'dispatch_once()'대신'if (self == [MYClass class])'를'+ initialize' 안에 넣고, 사전 생성을 다른 곳으로 옮기는 것이 아닙니다. 그런 다음이 클래스로 시작하는 상속 트리의 모든 클래스에 대한 첫 번째 메시지는 사전을 작성하고 다른 클래스는이를 다시 작성하지 않습니다.그게 맞습니까? –

3

NSDictionary은 너무 성가시다 (즉, 거대하지 않다)거나, plist를 만들 수있다. 그것을 귀하의 앱 번들에 포함 시키십시오. 그런 다음 앱이 실행될 때 plist (사전 코드 몇 줄)에서 사전을 읽습니다. 이러한 각각의 접근법은 거의 동일한 노력입니다. plist를 사용하는 이점은 코드를 변경해야하는 경우 코드가 아닌 plist를 편집한다는 것입니다.

+0

이것은 내가 과거에 종종 그렇게했기 때문이다. 그러나, 컴파일 타임에 완전히 알려진 무언가를 위해 런타임 계산을하고 있기 때문에 여전히 나에게 더러움을 느낀다! – elsurudo

+0

plist가 크면 실행 시간이 중요 할 수 있습니다. 그러나 처리를 백그라운드로 밀고 인식 가능한 지체를 완화 할 수있는 방법이 있습니다. 반면에, 당신은 무엇을 유지하기를 원하는가? 코드 또는 plist? 여기서의 대답은 데이터의 특성과 크기에 다소 의존합니다. –

+1

좋은 지적입니다. 나는 PLIST를 유지하는 것이 바람직하지만,이 경우 데이터 양은 적다는 것에 동의한다. 그러나 간단하고 가독성을 위해 PLISt 라우트가 끝납니다. – elsurudo

관련 문제