我有一个+initialize
被多次调用的方法,我不明白为什么。
根据文档,它将为每个类(以及子类)调用一次,
这是我正在使用的代码:
@interface MyClass : NSObject
@end
static NSArray *myStaticArray;
@implementation MyClass
+ (void)initialize
{
myStaticArray = [NSArray array];
}
@end
(显然还有其他代码,但这是相关部分)。
没有 的子类MyClass
。它没有做任何花哨的事情。+initialize 在我的应用程序启动时被调用一次(NSApplication 的委托告诉它用磁盘中的数据填充 myStaticArray)。然后第二次调用 +initialize,这是用户第一次选择与此类相关的菜单项。
我只是简单地添加dispatch_once()
了我的initialize
代码,这显然解决了我的问题。但我不明白这是怎么回事?为什么在没有子类的情况下会多次调用它?
这是第一次调用 +initialize 时的堆栈跟踪:
+[MyClass initialize]
_class_initialize
objc_msgSend
-[MyAppDelegate applicationDidBecomeActive:]
_CFXNotificationPost
NSApplicationMain
main
start
这是第二个电话:
+[MyClass initialize]
_class_initialize
NSApplicationMain
main
start
如您所见,我的代码似乎没有触发对 +initialize 的第二次调用(堆栈跟踪中没有任何内容)。它在我显示一个显示被清除的静态数组内容的窗口后立即发生+initialize
(窗口显示数组内容,但紧接着数组为空)。