我已经看到范围TyphoonScopeObjectGraph对于具有循环依赖关系(例如控制器和视图)非常有用,它具有指向控制器的委托属性。
所以我用以下场景对此进行了测试:
控制器A按下控制器B,控制器B将具有弱代表的控制器C指向控制器A.
Controller C有一个按钮,可以在此委托上执行方法。
我已经看到Typhoon实例化Controller C,它正确地将Controller A设置为委托,但是当按下按钮时,委托已更新为nil。
这是汇编代码:
- (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
这是ViewControllerA:
@interface ViewControllerA ()<ViewControllerDelegate>
@end
@implementation ViewControllerA
- (void)viewDidLoad {
[super viewDidLoad];
self.title = self.name;
}
- (void)viewControllerDidTapButton:(UIViewController *)viewController {
[self.navigationController popToRootViewControllerAnimated:YES];
}
这是为什么?有解决方法吗?
答案 0 :(得分:0)
TyphoonScopeObjectGraph仅在调用汇编 特定定义时创建共享范围 。所以如果:
如果要创建循环依赖关系回到之前构建的内容,则需要TyphoonScopeSingleton
或TyphoonScopeWeakSingleton
。在这种情况下,后者听起来很合适 - 对于我们自己的项目,我们有时会将这个范围用于共享的上下文&#39;当没有更多引用指向它时应该丢弃的对象。