Objective-C声明了一个类函数initialize(),在使用之前对每个类运行一次.它经常被用作交换方法实现(混合)等的入口点.
Swift 3.1弃用了这个函数并带有警告:
方法'initialize()'定义了Objective-C类方法'initialize',它不能保证被Swift调用,并且在将来的版本中将被禁止
如何解决这个问题,同时仍保持我目前使用initialize()入口点实现的相同行为和功能?
我有一个+initialize被多次调用的方法,我不明白为什么.
根据文档,它将为每个类(以及子类)调用一次,
这是我正在使用的代码:
@interface MyClass : NSObject
@end
static NSArray *myStaticArray;
@implementation MyClass
+ (void)initialize
{
myStaticArray = [NSArray array];
}
@end
Run Code Online (Sandbox Code Playgroud)
(显然还有其他代码,但这是相关部分).
没有子类MyClass.它没有任何花哨的东西.当我的应用程序启动时,+ initialize被调用一次(NSApplication的委托告诉它用磁盘中的数据填充myStaticArray).然后第二次调用+ initialize,这是用户第一次选择与此类相关的菜单项.
我只是添加dispatch_once()了我的initialize代码,这显然解决了我的问题.但我不明白发生了什么事?当没有子类时,为什么会多次调用它?
这是第一次调用初始化时的堆栈跟踪:
+[MyClass initialize]
_class_initialize
objc_msgSend
-[MyAppDelegate applicationDidBecomeActive:]
_CFXNotificationPost
NSApplicationMain
main
start
Run Code Online (Sandbox Code Playgroud)
这是第二个电话:
+[MyClass initialize]
_class_initialize
NSApplicationMain
main
start
Run Code Online (Sandbox Code Playgroud)
如您所见,我的代码似乎没有触发第二次调用+ initialize(堆栈跟踪中没有任何内容).它在我显示一个窗口后立即出现,+initialize该窗口显示清除的静态数组的内容(窗口显示数组内容,但在此之后数组为空).
在Java中,当该类被调用时,我使用静态块来执行一些代码,如本示例所示”
Class Name
{
static
{
for(int i = 0; i<10; i++)
{
}
}
}
Run Code Online (Sandbox Code Playgroud)
如何在Swift中翻译该代码?