Objective-Cのクラス初期化
Contents
+ (void)initializeを利用+ (void)loadを利用__attribute__((constructor))を利用
*こちらの説明は動的ロードなどによる挙動は考慮してないです
1.+ (void)initializeを利用
呼ばれるタイミング
- クラスが最初に利用される直前
注意点
- サブクラスで
+ (void)initializeを実装しないとスーパークラスの+ (void)initializeが呼ばれるので複数呼ばれる前提で実装する
1 | @interface Parent : NSObject |
+ (void)initializeは各クラスで一度しか呼ばれないのでクラス本体でのみ実装してカテゴリでは実装しない
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))) |
*こちらの内容はQiitaにも投稿されています。
Author: hmhv
Link: https://hmhv.info/2015/02/objectivec-class-initialize/
License: 知识共享署名-非商业性使用 4.0 国际许可协议