0

2 つのコントローラー間の切り替えで構成されるカスタム コンテナー コントローラーを作成しました。最初のコントローラーのビューをコンテナー コントローラーに追加するまでに、Instrument でメモリ リークが表示されます。現在、次の実装があります。

.h

#import <UIKit/UIKit.h>

@interface SCLDefaultSwitchViewController : UIViewController
{
@protected
    __weak UIViewController *_activeController;
}

@property (nonatomic, weak, readonly) UIViewController *activeController;
@property (nonatomic, weak) UIViewController *leftViewController;
@property (nonatomic, weak) UIViewController *rightViewController;

@終わり

.m:

- (void)viewDidLoad
{
    [super viewDidLoad];

    // set-up content container view
    self.view.autoresizesSubviews = YES;

    [self performSegueWithIdentifier:@"left" sender:self];
    NSAssert( (_leftViewController != nil) , @"left view controller shouldn't be nil!");
    _activeController = _leftViewController;

    [self addChildViewController:_activeController];
    [self.view addSubview:_activeController.view];   // ---> memory leak here!!!!!
    [_activeController didMoveToParentViewController:self];

    [self performSegueWithIdentifier:@"right" sender:self];
    NSAssert( (_rightViewController != nil) , @"right view controller shouldn't be nil!");
    [self addChildViewController:_rightViewController];
    [_rightViewController didMoveToParentViewController:self];

    //[self performSelectorInBackground:@selector(performBackgroundTasks) withObject:nil];
}

2 つのビューを切り替えるときに、ビューがスーパービューから適切に削除されていることを確認しています。

- (void) didTapOnStartButton:(SCLSplashScreenViewController *)sender
{
    //CGRect originFrame   = _contentContainerView.bounds;
    CGRect originFrame   = self.view.bounds;
    CGRect offsetFrame   = originFrame;
    offsetFrame.origin.x =  originFrame.size.width;

    UIViewController* toViewController   = self.rightViewController;
    UIViewController* fromViewController = self.leftViewController;

    toViewController.view.frame = offsetFrame;

    __weak SCLSwitchViewController *weakSelf = self;
    [self transitionFromViewController:fromViewController
                      toViewController:toViewController
                              duration:.4f
                               options: UIViewAnimationOptionCurveEaseOut
                            animations:^{
                                weakSelf.rightViewController.view.frame = originFrame;
                            }

                            // remove the splash screen controller when the animation is finished and delete it: we don't need it anymore
                            completion:^(BOOL finished){
                                if (finished){
                                    [weakSelf.leftViewController willMoveToParentViewController:nil];
                                    [weakSelf.leftViewController.view removeFromSuperview];
                                    [weakSelf.leftViewController removeFromParentViewController];
                                    weakSelf.leftViewController = nil;
                                    weakSelf.activeController = toViewController;
                                }
                            }];
}

リークする正当な理由が本当にわかりません。何か考えはありますか?

4

2 に答える 2