我正在使用带有“Plist 集成”的 Typhoon
我在程序集中定义了 AppDelegate
,如下所示:
- (AppDelegate *)appDelegate {
return [TyphoonDefinition withClass:[AppDelegate class] configuration:^(TyphoonDefinition *definition) {
[definition injectProperty:@selector(window)];
definition.scope = TyphoonScopeSingleton;
}];
}
在window
内,我有一个rootViewController
和一个由AppDelegate
实现的delegate
。
- (RootViewController *)rootViewController {
return [TyphoonDefinition withClass:[RootViewController class] configuration:^(TyphoonDefinition *definition) {
[definition injectProperty:@selector(delegate)];
}];
}
问题在于 delegate
是使用 AppDeleaate
的另一个实例设置的。我在 AppDelegate
init
中设置了一个断点,实际上它被调用了两次。
我知道解决方案是在运行时手动设置 AppDelegate
内的 delegate
,但我希望由typhoon 处理此问题。
注意:我还没有尝试过,但由 Storyboard 创建的 View Controller 可能会发生同样的情况。
最佳答案
好问题。
Typhoon 没有注入(inject)您的初始 AppDelegate,因为它是在 Typhoon 外部创建的。 Typhoon 有内部对象池,它们用于注入(inject)到另一个对象中,如果 Typhoon 池中没有对象,则将使用指定的初始值设定项创建该对象(如果范围是单例,则保留该对象)。
从 Storyboard创建的 ViewController 将被正确注入(inject),因为它们是在 Typhoon 中创建的。
要解决您的特定问题,请尝试对 AppDelegate 进行以下定义:
- (AppDelegate *)appDelegate {
return [TyphoonDefinition withClass:[AppDelegate class] configuration:^(TyphoonDefinition *definition) {
[definition setFactory:[self sharedApplication]];
[definition useInitializer:@selector(delegate)];
[definition injectProperty:@selector(window)];
definition.scope = TyphoonScopeSingleton;
}];
}
- (UIApplication *)sharedApplication {
return [TyphoonDefinition withClass:[UIApplication class] configuration:^(TyphoonDefinition *definition) {
[definition useInitializer:@selector(sharedApplication)];
}];
}
然后在解析 appDelegate
定义时,Typhoon 将调用 [[UIApplication sharedApplication] delegate]
方法并在 Typhoon 中注册返回的实例。
这样,AppDelegate 将仅创建一次(由 UIApplication)。但是注入(inject)将应用两次(一次在启动时,第二次在第一次解析 appDelegate 定义时)
更新
AppDelegate
案例已在台风中修复。您的原始代码现在可以运行(使用 head
版本或 future 版本)。
关于ios - 台风与单例 AppDelegate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26761490/