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;
}
}];
}
リークする正当な理由が本当にわかりません。何か考えはありますか?