8

アプリでカスタム トランジションを作成していますが、2 つの問題が発生しています。両方を処理するようにView Controllerを設定するUIViewControllerAnimatedTransitioningUIViewControllerTransitioningDelegate、View Controllerが割り当て解除されないという問題が発生します。具体的には、これにより保持が作成されます。

self.transitioningDelegate = self;

私がそれをしないで、TransitionController と呼ばれる別のものに入れUIViewControllerAnimatedTransitioningて、次のように設定した場合:UIViewControllerTransitioningDelegateNSObject

self.transitioningDelegate = [[TransitionController alloc] init];

これUIViewControllerdeallocatedですが、TransitionController オブジェクトでメモリ リークが発生します。誰かが今私が間違っていることをしていますか?

4

5 に答える 5

6

私は同じ問題に遭遇し、それを解決することができました。
カスタム トランジション API は十分に文書化されておらず、すべてを正しく行うには多くの試行錯誤が必要でした。

メモリの問題なしでうまく機能させる方法を説明しましょう。

プレイヤーは次のとおりです。

VCA = VCB をモーダルに
表示するビュー コントローラー VCB = モーダルに表示されるビュー コントローラー (VCA によって提示される)

TC = カスタム アニメーションを実行するカスタム トランジション コントローラ オブジェクト。「 UIViewControllerAnimatedTransitioning
」 に準拠した NSObject サブクラス。 TD 内でインスタンス化されます。

TD = システムにトランジション コントローラーを提供するカスタム トランジション デリゲート オブジェクト。「 UIViewControllerTransitioningDelegate」に準拠した NSObject サブクラス

それでは、VCB のインスタンスを示しましょう。

self = VCA のインスタンス
myModalViewController = self の強力なプロパティです

self.myModalViewController = [[VCB alloc] init];

[self.myModalViewController setModalPresentationStyle: UIModalPresentationCustom];
[self.myModalViewController setTransitioningDelegate: [[TD alloc] init]];
[self presentViewController: self.myModalViewController
                   animated:YES 
                 completion:NULL];

その後のある時点で、VCB は VCA に却下を要求します。

self = VCA のインスタンス
myModalViewController = 以前に提示された VCB のモーダルに提示されたインスタンス

[self dismissViewControllerAnimated:YES 
                         completion:^{
             [self.myModalViewController setTransitioningDelegate: nil]; // DO THIS!!!! 
             self.myModalViewController = nil;
        }];



これが役立つことを願っています。それは確かに私のためにしました。

于 2013-12-29T19:34:59.100 に答える
2

私の場合UIViewController、カスタムのインスタンスを保持する self() があり(それをUIViewControllerと呼びましょうmViewController)、self表示transitioningDelegate/非表示mViewConrollerです。保持サイクルを回避するための私の解決策は、これを of 内で呼び出すこと.mでしたmViewController:

-(void)viewDidDisappear:(BOOL)animated {
    self.transitioningDelegate = nil;
    [super viewDidDisappear:animated];
}

魔法のように働きました(:

于 2014-01-19T15:30:00.057 に答える
0

iOS7 で遷移が終了した後UIViewControllerAnimatedTransitioningオブジェクトは「from」VC によって保持されます(これは iOS8 では発生しません)。これにより、遷移オブジェクトがプロパティに何かを格納すると、メモリ リークが発生する可能性があります。これは過去に私を噛んだので、注意が必要です。

于 2015-05-14T02:27:04.587 に答える
0

2 回目の試行では、インスタンスを割り当てていますが、TransitionController解放されることはありません (誰も参照していないため)。オブジェクトは、Objective-C でデリゲートを保持してはならないため、コードの別のポイントからViewController参照する必要があります。delegate

于 2013-11-12T08:14:25.057 に答える
0

私の場合、提示されたView Controllerが保持されていたのは、アニメーションの完了ブロックに間違ったブール値を渡していたためです。

[transitionContext completeTransition:transitionContext.transitionWasCancelled];

それはこうあるべきだった:

BOOL successful = transitionContext.transitionWasCancelled == NO;
[transitionContext completeTransition:successful];

コードを 2 行に分割すると、読みやすくなります。

于 2016-12-05T07:20:52.197 に答える