我正在编写一个项目,其中一个非常简单的任务偶尔会失败。对这个结果很着迷,也很想知道你们对此有何看法。
我有一个包含大型数据集的项目,我正在创建并显示一个模式窗口以显示有关新类实例的一些详细信息。所以我有一个带有自定义窗口控制器类的窗口,代码如下:
MyWindowController.h:
#import <DataModel.h>
@interface MyWindowController : NSWindowController
@property (nonatomic, weak) FooClass *fooInstance;
@end
MyWindowController.m:
@implementation MyWindowController
@synthesize fooInstance = _fooInstance;
-(void) init {
self = [super init];
if (self) {
self.fooInstance = [FooClass new];
}
return self;
}
@end
完全千篇一律,对吧?但是当我第一次添加表单并运行了很多次时,任务一次又一次地失败了。self.fooInstance 一直返回为零。我什至确认 FooClass 初始化程序正在运行(直接通过它)并返回一个指向有效 FooClass 实例的非空指针。然而,在赋值行之后,self.fooInstance 仍然为空。
我跑了很多次,一遍又一遍地看同样的结果。然后,我只用这个替换了赋值语句:
FooClass *foo = [FooClass new];
self.fooInstance = foo;
......任务突然开始工作,从那以后它一直在运行。即使我将代码恢复为 self.fooInstance = [FooClass new],它也能完美运行。
我简直不敢相信......直到我看到它再次发生,在同一个项目中,同时为不同的班级敲出相同类型的窗口。
我不明白发生了什么。self.fooInstance 访问器完全是@synthesized;没有在后台运行的代码可能与该类有关(它是一个单线程模式窗口);并且没有任何东西与课程有关。它只是......不起作用。就像窗口类的代码要运行几次才能正常运行一样。
世界上正在发生什么?有没有人冒险猜测可能解释这种行为?