Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c +;多次调用初始化_Objective C_Cocoa - Fatal编程技术网

Objective c +;多次调用初始化

Objective c +;多次调用初始化,objective-c,cocoa,Objective C,Cocoa,我有一个+initialize方法被多次调用,我不明白为什么 根据文档,它将为每个类(以及子类)调用一次 这是我正在使用的代码: @interface MyClass : NSObject @end static NSArray *myStaticArray; @implementation MyClass + (void)initialize { myStaticArray = [NSArray array]; } @end (显然还有其他代码,但这是相关部分) 没有MyCla

我有一个
+initialize
方法被多次调用,我不明白为什么

根据文档,它将为每个类(以及子类)调用一次

这是我正在使用的代码:

@interface MyClass : NSObject

@end

static NSArray *myStaticArray;

@implementation MyClass

+ (void)initialize
{
  myStaticArray = [NSArray array];
}

@end
(显然还有其他代码,但这是相关部分)

没有
MyClass
的子类。它不做任何花哨的事。当我的应用程序启动时,+initialize被调用一次(NSApplication的委托告诉它用磁盘上的数据填充myStaticArray)。然后,+initialize被称为第二次,用户第一次选择与这个类相关的菜单项

我只是在我的
initialize
代码周围添加了
dispatch\u once()
,这显然解决了我的问题。但我不明白发生了什么?为什么在没有子类的情况下会多次调用它

这是第一次调用+initialize时的堆栈跟踪:

+[MyClass initialize]
_class_initialize
objc_msgSend
-[MyAppDelegate applicationDidBecomeActive:]
_CFXNotificationPost
NSApplicationMain
main
start
这是第二个电话:

+[MyClass initialize]
_class_initialize
NSApplicationMain
main
start

如您所见,我的代码似乎不会触发对+initialize的第二次调用(堆栈跟踪中没有任何内容)。它发生在我显示一个窗口之后,该窗口显示了由
+initialize
清除的静态数组的内容(该窗口显示数组内容,但紧接着数组为空)。
+initialize
为继承链上的每个类调用,因此,如果您初始化两个共享同一超类(或一个超类及其一个子类)的类,那么超类“
+initialize
方法将被调用两次


这可能是原因吗?

+initialize
将在每个类第一次被引用(通过消息)时发送给每个类,包括动态创建的类。运行时中没有防止多次触发执行的保护。如果子类已初始化,但未实现
+initialize
,则链上的任何
super
都将再次调用它们的子类

正交地,自动KVO是通过创建观察到的实例类的动态派生子类来实现的。该子类与任何其他类一样是
+initialize
d,因此触发父类的
+initialize
的多次执行

运行时可以采取措施防止这种情况。然而,由于
+initialize
一直被记录为可能被执行多次,因此增加的复杂性(考虑到KVO类可能频繁地来来去去去,这是令人惊讶的复杂)被认为不值得付出努力

目前推荐的模式是:

+ (void) initialize
{
      static dispatch_once_t once;
      dispatch_once(&once, ^{
        ... one time initialization here ...
      });
}

1.运行时在子类之前的超类中调用+初始化方法

2.若子类并没有方法,那个么它将调用父类初始化方法

3.使用始终记录方式初始化方法 +(无效)初始化{

if(self==[Car Class]){

//initialize here your static var
}  
}

为了清楚地理解这篇文章

你能添加
NSLog(@“class=%@),NSStringFromClass([self class])吗
并发布输出。帮助:@trojanfoe谢谢,我应该早点尝试。第二次是由
NSKVONotifying_MyClass
触发的,这是我到目前为止从未听说过的。似乎
KVO
会自动创建一些对象的子类?我有一个
NSTableView
显示这个类的一些对象(通过
NSArrayController
)。有人知道这方面的更多信息吗?我找不到太多文档。动态创建的子类已经讨论过了,但这不是实际的文档。尽管如此,希望它能有所帮助。@bbum源代码是观察键值的。我有一个绑定到数组控制器的表视图,它绑定到包含此类对象的数组。没有堆栈跟踪中有用的东西是,它位于
NSApplicationMain()
内部,但在self上执行NSLog会显示类名:
nskvontifiing\u MyClass
。在我显示包含表视图的窗口后不久,它就会被调用(而不是作为显示它的一部分)。父类是NSObject,没有子类。