1

スコープTyphoonScopeObjectGraphは、コントローラーやビューなど、コントローラーを指すデリゲート プロパティを持つ循環依存関係を持つのに役立つことがわかりました。

そこで、次のシナリオでこれをテストしました。

コントローラー A がコントローラー B をプッシュし、コントローラー B がコントローラー A を指す弱いデリゲートを持つコントローラー C をプッシュします。

コントローラー C には、このデリゲートでメソッドを実行するボタンがあります。

Typhoon がコントローラー C をインスタンス化し、コントローラー 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];
}

どうしてこれなの?回避策はありますか?

4

1 に答える 1