2013-12-08 5 views
8

インタラクティブトランジションがキャンセルされると、提示されたビューコントローラは決して解放されません(deallocは決して呼び出されません)。インタラクティブトランジションが正常に完了すると、すべて正常ですが、このトランジションがキャンセルされると、デスティネーションビューコントローラは決して解放されないようです。その結果、メモリが失われますが、メモリリークは発生しません(少なくともInstrumentsでは検出されません)。私は間違ったことをしている可能性がありますが、私はそれが何かを見ません。他の誰かがこの問題を抱えているという証拠を見つけることができなかったので、私はそれが私だと思います。iOS 7インタラクティブトランジションをキャンセルしても表示されたビューコントローラが解放されない

私は問題を示す非常に小さなサンプルプロジェクトを持っています(https://github.com/mparma-isi/InteractiveTransitionIssue.git)。赤い四角形のタップが2番目のビューコントローラへのトランジションを実行します。第2のコントローラのタップは、そのコントローラを第1のコントローラに戻す。最初のビューコントローラーの赤い四角の内側のピンチジェスチャーは、UIPercentDrivenInteractiveTransitionを使用してインタラクティブなトランジションを開始します。トランジション(ピンチの負の速度)をキャンセルすると、表示されたビューコントローラは解放されません。移行が完了すると、すべて正常に動作します。

ご協力いただきありがとうございます。

マイク

+0

私は少し遅れて返信すると思いますが、私もこの問題に直面しています。実際、それは私が見つけることができるすべての例に存在するので、これはUIKitバグであると仮定することは安全だと思います。あなたはおそらく、回避策を考え出しましたか? – Nicky

+0

まだ変わらない –

答えて

0

は、だから私はリーク機器でこれをプロファイリングして何か面白いものを見つけました:

Leaks instrument trace

メモリリークが強調表示された行から来ているようです。ペアになっている-[UIWindow _remoteRotationViewController:]コールはどこにでもありません(それが何であれ)。そのため、ウィンドウは、提示されたView Controllerを有効に保ちます。

かなり醜いが、この回避策は私のためのトリックを行います。

- (void)animationEnded:(BOOL)transitionCompleted { 
    if (!transitionCompleted) { 
     UIViewController *viewController = ...; // get the presented view controller 

     UIWindow *window = [UIApplication sharedApplication].keyWindow; 
     SEL selector = NSSelectorFromString(@"_removeRotationViewController:"); 
     if ([window respondsToSelector:selector]) { 
#pragma clang diagnostic push 
#pragma clang diagnostic ignored "-Warc-performSelector-leaks" 
      [window performSelector:selector withObject:viewController]; 
#pragma clang diagnostic pop 
     } 
    } 
} 

私はこのためにレーダーを提出するつもりです。

関連する問題