Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.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
Ios 台风带单粒子_Ios_Objective C_Iphone_Dependency Injection_Typhoon - Fatal编程技术网

Ios 台风带单粒子

Ios 台风带单粒子,ios,objective-c,iphone,dependency-injection,typhoon,Ios,Objective C,Iphone,Dependency Injection,Typhoon,我正在使用带有“Plist集成”的Typhone 我在程序集中定义了AppDelegate,如下所示: - (AppDelegate *)appDelegate { return [TyphoonDefinition withClass:[AppDelegate class] configuration:^(TyphoonDefinition *definition) { [definition injectProperty:@selector(window)];

我正在使用带有“Plist集成”的Typhone

我在程序集中定义了
AppDelegate
,如下所示:

- (AppDelegate *)appDelegate {
    return [TyphoonDefinition withClass:[AppDelegate class] configuration:^(TyphoonDefinition *definition) {
        [definition injectProperty:@selector(window)];
        definition.scope = TyphoonScopeSingleton;
    }];
}
窗口中
,我有一个
rootViewController
和一个
委托
,它由
AppDelegate
实现

- (RootViewController *)rootViewController {
    return [TyphoonDefinition withClass:[RootViewController class] configuration:^(TyphoonDefinition *definition) {
        [definition injectProperty:@selector(delegate)]; 
    }];
}
问题是,
委托
是用另一个
AppDeleaate
实例设置的。我在
AppDelegate
init
中设置了一个断点,实际上它被调用了两次

我知道一个解决方案是在运行时在
AppDelegate
内手动设置
delegate
,但我希望这由Typhone处理

注意:我还没有尝试过,但同样的情况也可能发生在由故事板创建的视图控制器上。

好问题

台风没有注入您的初始AppDelegate,因为它是在台风之外创建的。Typhone具有Internal对象池,它们用于注入到另一个对象中,如果Typhone在池中没有对象,则将使用指定的初始值设定项创建该对象(如果作用域为singleton,则保留该对象)

从故事板创建的ViewController将正确注入,因为它们是在Typhone中创建的

要解决您的特定问题,请尝试以下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)];
    }];
}
public dynamic func appDelegate() -> AnyObject {
return TyphoonDefinition.withClass(AppDelegate.self) {
  (definition) in

  // load up any environment variables/injections
  definition.injectProperty("assembly", with: self)
  definition.injectProperty("window", with: UIWindow(frame: UIScreen.mainScreen().bounds))
  definition.scope = TyphoonScope.LazySingleton
}  
然后在解析
appDelegate
定义时,Typhone将调用
[[UIApplication sharedApplication]delegate]
方法,并在Typhone中注册返回的实例

这样,AppDelegate将只创建一次(由UIApplication创建)。。但注入将应用两次(一次在启动期间,第二次在第一次解析appDelegate定义时)

更新


AppDelegate
案例已在台风内部修复。您的原始代码现在可以使用了(使用
head
版本或在将来的版本中)。

这似乎在8.4中又被破坏了

在进行Typhone plist集成时,您将得到2个AppDelegate。一个由UIApplication创建,一个由Typhone管理

我改变了当前台风文档中创建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)];
    }];
}
public dynamic func appDelegate() -> AnyObject {
return TyphoonDefinition.withClass(AppDelegate.self) {
  (definition) in

  // load up any environment variables/injections
  definition.injectProperty("assembly", with: self)
  definition.injectProperty("window", with: UIWindow(frame: UIScreen.mainScreen().bounds))
  definition.scope = TyphoonScope.LazySingleton
}  
按照你的答案去做

这修复了2x AppDelegate的问题,但留下了鸡和蛋的问题;具体来说,AppDelegate是在通过plist创建程序集之前由UIApplication创建的。因此,如果您的视图控制器由Typhone管理,而不是通过故事板管理,则在appDelegate的didFinishLaunchingWithOptions设置阶段,它们将不存在

为了解决这个问题,我最终使Typhone程序集成为一个普通的单例程序集,并删除了plist集成

我希望这能帮助人们解决同样的问题