2011-08-31 4 views
2

NSObject의 헤더 파일을 살펴 봤는데 싱글 톤 클래스를 만들고 있습니다. 문제는 NSNotifications를 관찰하고 질문 할 때 현재 상태를보고함으로써 애플리케이션의 상태를 유지하기 때문에 기본적으로 애플리케이션의 시작부터로드해야한다는 것입니다.+ (void) load가있는 Singleton Safety

이 문제에 대한 해결책은 NSObject에서 +(void)load 메서드를 사용하는 것입니다. 클래스가 메모리에로드 될 때, 나는 load 메소드를 오버라이드하여 그 단계에서 싱글 톤을 할당하려고했습니다.

로드 방법 중에 [[*class* alloc] init]을 호출해도 안전한지 확실하지 않습니다. 나는 그것이 문서화되지 않는 한 일반적으로 가정 할 것이지만,이 항목의 중요성과 앱이 시작될 때마다이 값을로드한다는 사실을 고려할 때 누구나 이것이 안전한지에 대한 지식이 있다는 것을 알고 싶습니다. 안심을 위해서 말입니다.

도움을 주셔서 감사합니다.

답변

4

init을 호출 할 때 클래스와 슈퍼 클래스가 정확히 무엇을하는지에 따라 다릅니다. load 동안 다른 클래스를 사용할 수 있다고 보장 할 수 없습니다. 수업의 init에 다른 수업이 필요하지 않은 경우 수업에서 벗어날 수 있습니다.

대신 + (void)initialize에서이 작업을 수행하고, 필요한 경우 애플리케이션 실행 중에 설정 기능을 호출하는 것이 안전합니다 (예 : iOS의 application:didFinishLaunchingWithOptions:).

+0

예, 트릭을 수행합니다. 여기서 중요한 점은 + (void) initialize는 각 클래스 (!)의 프로그램 초기화시 한 번만 호출된다는 것입니다. 각 클래스에 대해 [슈퍼 초기화]를 호출 할 필요가 없음을 의미합니다. 반면 하위 클래스의 코더가 하위 클래스 내 [super initialize]를 호출하기 때문에 두 번 호출 될 때 오류 또는 메모리 누수가 발생하지 않는 방식으로 코드 + 초기화가 저장됩니다 + 메소드 초기화. 따라서 당신은 하나의 유일한 인스턴스를 생성하기 위해 그것을 사용할 수 있어야합니다. 반면에 + init이 아마도 더 좋습니다. –

+0

+ (void)를 초기화 할 때 발생하는 문제는 Apple의 문서에서 설명합니다. "런타임은 클래스의 바로 전에 한 번 프로그램의 각 클래스에 초기화를 보내거나이 클래스에서 상속 한 클래스는 (따라서 클래스가 사용되지 않으면이 메소드를 호출 할 수 없습니다.) "- 사용자가로드 업시이 메소드를 호출 할 수없는 정적 라이브러리를 개발 중입니다. 객체는 사용 여부와 상관없이 처음부터 상태를 모니터하기 위해 객체 자체만으로 싱글 톤을 생성해야합니다. 이것이 + (void) 초기화를 피한 이유입니다. –