ios - 台风与单例 AppDelegate

标签 ios objective-c iphone dependency-injection typhoon

我正在使用带有“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/

相关文章:

ios - isRegisteredForRemoteNotifications 返回 true 即使我完全禁用它

iphone - iOS SDK写在UIImage上绘制文本

android - iOS 的相关概念,例如 "APK Expansion Files in Android"

ios - 在 UiTableViewCell 上设置时,DisclosureButton Indicator 或 Any kind of Accessory Type 似乎没有出现

ios - iOS 上的 OpenGL 内存管理

iPhone SDK 4.0.2?

iphone - 为什么我的 "initiwithframe"变黑了?使用initwithframe绘制CGRect圆角

ios - 从坐标创建 MKMapRect 并使用 mapView.visibleMapRect

ios - 福昕IOSRDK : not able to click on Hyperlink

ios - 循环获取数据时 CoreData 崩溃