我们有一个项目,它构建了两个独立的目标,这些目标具有实现UIApplicationDelegate
. 从两个特定于应用程序的应用程序委托中提取超类后,我们发现应用程序在启动时崩溃,并出现错误,通常表明已连接IBOutlet
但没有有效的实现:
[...YYYAppDelegate... setValue:forUndefinedKey:]:此类不符合键窗口的键值编码。
崩溃的堆栈跟踪和时间是这个问题的典型 - 显然,我们做了一些破坏window
属性的事情。
在执行重构之前,我们的应用程序委托接口和实现看起来像这样:
@interface YYYAppDelegate : NSObject <UIApplicationDelegate>
...
@property (nonatomic, strong) IBOutlet UIWindow *window;
...
@end
@implementation YYYAppDelegate
// No @synthesize of window
...
@end
@interface ZZZAppDelegate : NSObject <UIApplicationDelegate>
...
@property (nonatomic, strong) IBOutlet UIWindow *window;
...
@end
@implementation ZZZAppDelegate
// No @synthesize of window
...
@end
通过我们在每个类的块中window
重新声明window
属性,该属性是自动合成的。UIApplicationDelegate
@interface
重构之后,事情看起来像这样:
@interface XXXAppDelegate : NSObject <UIApplicationDelegate>
...
@end
@implementation XXXAppDelegate
...
@end
@interface YYYAppDelegate : XXXAppDelegate
...
@property (nonatomic, strong) IBOutlet UIWindow *window;
...
@end
@implementation YYYAppDelegate
// No @synthesize of window
...
@end
@interface ZZZAppDelegate : XXXAppDelegate
...
@property (nonatomic, strong) IBOutlet UIWindow *window;
...
@end
@implementation ZZZAppDelegate
// No @synthesize of window
...
@end
这里发生了什么?为什么以这种方式提取超类会破坏window
属性?