Ios 推送视图控制器时的循环依赖关系

Ios 推送视图控制器时的循环依赖关系,ios,typhoon,Ios,Typhoon,我已经看到,作用域对于具有循环依赖关系非常有用,例如控制器和视图,它具有指向控制器的委托属性 因此,我使用以下场景对此进行了测试: 控制器A推送控制器B,控制器B推送具有指向控制器A的弱委托的控制器C 控制器C有一个按钮,用于在此委托上执行方法 我已经看到台风实例化了控制器C,它正确地将控制器A设置为委托,但是当按下按钮时,委托已更新为零 这是汇编代码: - (ViewControllerA *)viewControllerA { return [TyphoonDefinition wi

我已经看到,作用域对于具有循环依赖关系非常有用,例如控制器和视图,它具有指向控制器的委托属性

因此,我使用以下场景对此进行了测试:

控制器A推送控制器B,控制器B推送具有指向控制器A的弱委托的控制器C

控制器C有一个按钮,用于在此委托上执行方法

我已经看到台风实例化了控制器C,它正确地将控制器A设置为委托,但是当按下按钮时,委托已更新为零

这是汇编代码:

- (ViewControllerA *)viewControllerA {
    return [TyphoonDefinition withClass:[ViewControllerA class]
                          configuration:^(TyphoonDefinition *definition) {
        [definition injectProperty:@selector(name) with:@"Hello world!"];
    }];
}

- (ViewControllerC *)viewControllerC {
    return [TyphoonDefinition withClass:[ViewControllerC class]
                          configuration:^(TyphoonDefinition *definition) {
        [definition injectProperty:@selector(delegate) with:[self viewControllerA]];
    }];
}
这是ViewControllerC:

@interface ViewControllerC : UIViewController

@property (weak, nonatomic) id<ViewControllerDelegate> delegate;

@end

@implementation ViewControllerC

- (IBAction)buttonAction:(id)sender {
    [self.delegate viewControllerDidTapButton:self];
}

@end
@interface ViewControllerC:UIViewController
@属性(弱、非原子)id委托;
@结束
@实现视图控制器
-(iAction)按钮操作:(id)发送者{
[self.delegate viewcontrollerdtapbutton:self];
}
@结束
这是ViewControllerA:

@interface ViewControllerA ()<ViewControllerDelegate>

@end

@implementation ViewControllerA

- (void)viewDidLoad {
    [super viewDidLoad];
    self.title = self.name;
}

- (void)viewControllerDidTapButton:(UIViewController *)viewController {
    [self.navigationController popToRootViewControllerAnimated:YES];
}
@interface ViewControllerA()
@结束
@实现视图控件
-(无效)viewDidLoad{
[超级视图下载];
self.title=self.name;
}
-(无效)viewControllerDidTapButton:(UIViewController*)viewController{
[self.navigationController-popToRootViewControllerAnimated:是];
}

为什么会这样?是否有解决方法?

只有在调用汇编特定定义时,TyphonScopeObjectGraph才会创建共享作用域。因此,如果:

  • 视图控制器A内置于一个调用中
  • 然后构建视图控制器C,在视图控制器a上创建依赖项将创建一个新实例,由于弱引用,该实例随后将再次变为零

如果要创建一个循环依赖项,使其返回到先前构建的内容,则需要
TyphonScopeSingleton
TyphonScopeWeakSingleton
。在这种情况下,后者听起来很合适——对于我们自己的项目,我们有时会将该范围用于共享的“上下文”对象,当没有更多的引用指向它时,应该将其丢弃

TyphonScopeObjectGraph仅在调用汇编特定定义时创建共享作用域。因此,如果:

  • 视图控制器A内置于一个调用中
  • 然后构建视图控制器C,在视图控制器a上创建依赖项将创建一个新实例,由于弱引用,该实例随后将再次变为零

如果要创建一个循环依赖项,使其返回到先前构建的内容,则需要
TyphonScopeSingleton
TyphonScopeWeakSingleton
。在这种情况下,后者听起来很合适——对于我们自己的项目,我们有时会将该范围用于共享的“上下文”对象,当没有更多的引用指向它时,应该将其丢弃

你能发布你的汇编代码吗?我已经添加了示例代码。谢谢,我已经回答了。抱歉耽搁了,我们这一周非常忙。你能发布你的汇编代码吗?我已经添加了示例代码。谢谢,我已经回答了。很抱歉耽搁了,我们这一周非常忙。谢谢你的回答,但是,我不明白为什么要创建带有单例作用域的ViewControllerA。ViewControllerA是创建的,然后按下B,然后按下C,所以一定有人保留了A。我的意思是,A没有被释放,所以,我不知道为什么在执行按钮操作时它是零。使用
typhoscopeobjectgraph
,当Typhone组装ViewControllerC时,它将提供一个视图控制器a的新实例。因为ViewControllerC只持有一个弱引用,所以它将被置零,因为没有任何东西持有强引用。如果您使用
typhonscopewaksingleton
(尝试)声明视图控制器A,它将按照您的预期工作。然后你可以问更多的问题来巩固你的理解。谢谢!是的,我只是想试试。它现在正在按预期工作。现在,问题是:使用
typhonscopewaksingleton
,谁保留ViewControllerA、typhone、Apple代码,还是两者都保留?使用typhonscopewaksingleton,您的代码可以保留对正在构建的组件的强引用。示例:将其提供给拥有强大所有权的房地产,或将台风构建的视图控制器推送到UINavigationController上(该控制器包含其呈现的所有VCs的数组)。好的是,一旦没有任何东西具有强大的引用,它就会被释放。所以,实际上,台风并没有保留作用域弱单态的成分。(在幕后是这样的,然后在需要时使用一些魔术来发布-这不是一个重要的细节)。谢谢你的回答,但是,我不明白为什么我要创建带有单例作用域的ViewControllerA。ViewControllerA是创建的,然后按下B,然后按下C,所以一定有人保留了A。我的意思是,A没有被释放,所以,我不知道为什么在执行按钮操作时它是零。使用
typhoscopeobjectgraph
,当Typhone组装ViewControllerC时,它将提供一个视图控制器a的新实例。因为ViewControllerC只持有一个弱引用,所以它将被置零,因为没有任何东西持有强引用。如果您使用
typhonscopewaksingleton
(尝试)声明视图控制器A,它将按照您的预期工作。然后你可以问更多的问题来巩固你的理解。谢谢!是的,我只是想试试。它现在正在按预期工作。现在,问题是:使用
typhonscopewaksingleton
,谁保留ViewControllerA、typhone、Apple代码,还是两者都保留?使用typhonscopewaksingleton,您的代码可以保留对正在构建的组件的强引用。示例:将其提供给拥有强大所有权的房地产,或将台风构建的视图控制器推送到UINavigationController上(该控制器包含其呈现的所有VCs的数组)。好的是,一旦没有任何东西具有强大的引用,它就会被释放。所以,实际上,台风并没有保留c