+ (void)initialize를 이용+ (void)load를 이용__attribute__((constructor))를 이용
*이 설명은 동적로드등에 의한 거동은 고려하지 않음
1.+ (void)initialize를 이용
호출 시점
- 클래스가 최초로 이용되기 직전
주의점
- 서브클래스에서
+ (void)initialize를 구현하지 않으면 슈퍼클래스트의+ (void)initialize가 호출되므로 복수회 호출된다는 전제로 구현
1 | @interface Parent : NSObject |
+ (void)initialize는 각 클래서에서 1번만 호출되므로 클래스 본체에서만 구현하고 카테고리에서는 구현하지 않음
1 | @implementation Parent |
- 클래스가 프로그램내에서 이용되지 않으면 호출되지 않음
2. + (void)load를 이용
호출 시점
- 클래스가 메모리에 로드된 직후, main함수가 호출되기 전
주의점
- 다른 클래스는 아직 로드되지 않았을 가능성이 있으므로 다른 클래스는 이용하지 않음
1 | @implementation Parent |
- 클래스 본체와 카테고리에서 복수 구현하면 모두 호출됨
1 | @implementation Parent |
3. __attribute__((constructor))를 이용
호출 시점
- main함수가 호출되기 직전, 모든 클래스가 로드된 후
1 | @interface Parent : NSObject |
주의점
이것은 정확히 말하면Objective-C의 기능이 아니고 GCC가 제공하는 함수속성 기능임
복수의
__attribute__((constructor))는 우선도를 지정하여 호출순서를 지정가능
1 | __attribute__((constructor(2))) |