それが物事を設定するためのものであることは明らかであるように思われます。
- 正確にはいつ実行されますか?
- なぜ括弧が2つあるのですか?
__attribute__
関数ですか?マクロですか?構文ですか?- これは C や C++ でも動作しますか?
- 連携する関数は静的である必要がありますか?
- いつ
__attribute__((destructor))
実行されますか?
__attribute__((constructor))
static void initialize_navigationBarImages() {
navigationBarImages = [[NSMutableDictionary alloc] init];
}
__attribute__((destructor))
static void destroy_navigationBarImages() {
[navigationBarImages release];
}
ベストアンサー1
- 通常はプログラムの起動時に共有ライブラリがロードされたときに実行されます。
- GCC 属性はすべてこのようになっています。おそらく関数呼び出しと区別するためでしょう。
- GCC 固有の構文。
- はい、これは C と C++ で動作します。
- いいえ、関数は静的である必要はありません。
- デストラクタは、共有ライブラリがアンロードされるとき、通常はプログラム終了時に実行されます。
したがって、コンストラクタとデストラクタの動作は、共有オブジェクト ファイルに、それぞれコンストラクタ属性とデストラクタ属性でマークされた関数への参照を含む特別なセクション (ELF では .ctor と .dtor) が含まれるというものです。ライブラリがロード/アンロードされると、ダイナミック ローダー プログラム (ld.so など) は、そのようなセクションが存在するかどうかを確認し、存在する場合は、その中で参照されている関数を呼び出します。
考えてみれば、通常の静的リンカーにも同様の魔法があり、ユーザーが静的リンクを選択するか動的リンクを選択するかに関係なく、起動時/シャットダウン時に同じコードが実行されるはずです。