2014-02-10 3 views
1

내 클래스에서 상수이어야하는 NSString이 있습니다. 다음 코드를 사용하여이 작업을 수행했습니다.클래스 수준에서 정적 NSString 초기화

@interface DefinitionViewController() 
@end 

static NSString *preamble; 

@implementation DefinitionViewController { 

} 

+(void)initialize { 
    if (self == [DefinitionViewController class]) { 
    NSString *path = [[NSBundle mainBundle] pathForResource:@"preamble" ofType:@"html"]; 
    preamble = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding 
    error:nil]; 
    } 
} 

잘 작동하는 것 같습니다. initialize 안에있는 파일을 사용하는 것에 대해 걱정이됩니다. 동일한 목표 (정적 문자열 공유)를 수행하는보다 적절한 방법이 있습니까? 이 코드를 내 코드 안에 묻을 수 있지만 다소 큰 문자열을 외부 파일로 유지하는 것이 훨씬 쉬웠습니다.

어떤 조언을 주셔서 감사합니다.

답변

2

"초기화하는 동안 파일을 읽는 것에 대해 걱정합니다."

걱정하지 마십시오. 예를 들어, 클래스 메소드라는 사실은 완전히 무의미합니다. 그것은 코드입니다. 그것은 달리고 일을합니다. 그것은 건전한 코드이며 일관된 시간에 일관되게 실행되며 앱 번들은 실제로 리소스를 포함하고있는 진정한 것입니다. 여기에는 문제가 없습니다.

문자열 생성을 연기하고 문자열이 두 번 초기화되지 않는다고 확신하게 만들려면 처음에 명시 적으로 요청 될 때까지 문자열 값이 생성되지 않도록 단일 패턴을 사용할 수 있습니다 :

+ (NSString*) preamble { 
    static NSString* preamble = nil; 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
     NSString *path = [[NSBundle mainBundle] pathForResource:@"preamble" ofType:@"html"]; 
     preamble = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil]; 
    }); 
    return preamble; 
} 

그러나 특별히 필요하지는 않습니다. (편집 :하지만, 그 반대로, 누가 진짜로 물건을 알고 @bbum의 아래 참조하십시오.)

+0

그리고 실제로, 내 대답을 참조하십시오 : http://stackoverflow.com/a/21324237/341994 – matt

+0

경우 나는 문서를 올바르게 이해했다.'초기화 '를 가진 경쟁 조건이 없다. 그래서 싱글 톤은 정말로 과잉이다. 또한 앱 번들에서 읽은 파일이 교착 상태를 일으키지 않는다고 가정합니다. 감사. – Bill

+0

@Bill "+ 초기화"메소드는 "무거운 짐을 싣기"위해 사용되어서는 안됩니다. 예기치 않은 클래스 초기화 순서 종속성에서 나중에 리팩토링하는 데 어려움을 겪지 못하게하는 느린 시작 시간에 이르기까지 여러 가지 문제가 발생할 수 있습니다. 이 경우 * 아마 * 상처를 입지 않을 것이지만, 싱글 톤 패턴을 사용하라는 제안은 확실히 더 나은 선택입니다 (최적화 단계에서 여전히 문제가 될 수있는 게으른 초기화의 형태입니다). – bbum