1

uiviewcontroller の追加と削除による総メモリの管理に関するいくつかの基本的な問題がありますが、CAtransition を使用してアニメーションを追加する場合のみです。以下の状況の簡単なシナリオを設定しました。

IVC と呼ばれる初期化/割り当てを行う基本的なビュー コントローラーがあり、現在の uiController に追加します。ヘッダー ファイルでは、単に宣言されているだけです。

IntroViewController* IVC;

AT START : リークで示される合計 3 MB のメモリ

合計3.6MBのメモリ

IVC=[[IntroViewController alloc] initWithNibName:@"Intro" bundle:[NSBundle mainBundle]];
[IVC.view setUserInteractionEnabled:YES];   
[self.view addSubview:IVC.view];

それから私は解放します:

[[IVC.view layer] removeAllAnimations];
[IVC.view removeFromSuperview];//remove intro animation
[IVC release];

ここで予想されるように、合計メモリは 3MB に戻ります

しかし、リリースコードを削除して以下を追加すると、フェードインが発生し、ここに示されているオブジェクトがリリースされます。

CATransition *applicationIntroLoadViewIn = [CATransition animation];
[applicationIntroLoadViewIn setDuration:.5];
[applicationIntroLoadViewIn setType:kCATransitionReveal];
[applicationIntroLoadViewIn setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn]];
[applicationIntroLoadViewIn setValue:@"IntroFadeIn" forKey:@"IntroAnimation"];
[applicationIntroLoadViewIn setDelegate:self];
[[IVC.view layer] addAnimation:applicationIntroLoadViewIn forKey:nil];

その後 :

アニメーションが終了したときに処理するメソッドを作成します。

- (void)animationDidStop:(CAAnimation *)animation finished:(BOOL)flag{
NSString* value = [animation valueForKey:@"IntroAnimation"];

if ([value isEqualToString:@"IntroFadeIn"]){
    //this def gets called NSLog shows up
    [[IVC.view layer] removeAllAnimations];
    [IVC.view removeFromSuperview];//remove intro animation
    [IVC release];
    IVC=nil;
}

報告されたリークはありません。ビューは削除されますが、メモリは依然としてリークで 3.6MB のままですか? これが起こる理由は何ですか?私はアニメーション*を割り当てていないので、クリーンアップする必要はないと感じていますが、これは何かがまだIVCビューに保持されていることを示唆しています

どんな助けでも大歓迎です。

4

1 に答える 1

-1

applicationIntroLoadViewIn.removedOnCompletion = YES;CATransition セットアップ コード スニペットを試してみてください。

于 2012-08-20T08:00:23.433 に答える