複数回呼び出されている+initialize
メソッドがありますが、その理由がわかりません。
ドキュメントによると、すべてのクラス (およびサブクラス) に対して 1 回呼び出されます。
これは私が使用しているコードです:
@interface MyClass : NSObject
@end
static NSArray *myStaticArray;
@implementation MyClass
+ (void)initialize
{
myStaticArray = [NSArray array];
}
@end
(明らかに他のコードがありますが、それは関連する部分です)。
のサブクラスはありませんMyClass
。派手なことは何もしません。+initialize は、アプリケーションが起動されたときに 1 回呼び出されます (NSApplication のデリゲートは、myStaticArray にディスクからのデータを入力するように指示します)。+initialize が 2 回目に呼び出されます。これは、ユーザーがこのクラスに関連するメニュー項目を初めて選択したときです。
コードを追加dispatch_once()
しただけinitialize
で、明らかに問題が解決しました。しかし、私は何が起こっているのか理解していませんか?サブクラスがないのに、なぜ複数回呼び出されるのですか?
これは、+initialize が初めて呼び出されたときのスタック トレースです。
+[MyClass initialize]
_class_initialize
objc_msgSend
-[MyAppDelegate applicationDidBecomeActive:]
_CFXNotificationPost
NSApplicationMain
main
start
そして、これが2番目の呼び出しです:
+[MyClass initialize]
_class_initialize
NSApplicationMain
main
start
ご覧のとおり、私のコードは +initialize への 2 回目の呼び出しをトリガーしていないようです (スタック トレースには何もありません)。クリアされた静的配列の内容を表示するウィンドウを表示した直後に発生し+initialize
ます (ウィンドウには配列の内容が表示されますが、その直後に配列は空になります)。