-1

ARCをオンにしてxcode 4.4を使用しています。ViewController.m で UIView を動的に作成しました。

UIView* myviews[10];

次に、 - (void)viewDidLoad 関数で、それぞれに必要な写真を入力します

myviews[viewIndex] = [[UIView alloc]initWithFrame:myrec];
UIImage *testImg;
UIImageView * testImgView = [[UIImageView alloc]init];
testImg = [UIImage imageNamed:[NSString stringWithFormat:@"imgarray%d.png", viewIndex];
[testImgView setImage:testImg];
[myviews[viewIndex] addsubView:testImgView];
viewindex++;

あるビューから別のビューにジャンプしたいときは、次に2つのボタンを使用します。

[self.view addSubview:views[viewIndex]];
CATransition *animation = [CATransition animation];
[animation setDelegate:self];
[animation setDuration:1.0f];
[animation setType:@"rippleEffect"];
[animation setSubtype:kCATransitionFromTop];
//[animation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]];
[self.view.layer addAnimation:animation forKey:@"transitionViewAnimation"];

悪いことはないようですが、ビューを切り替えるとメモリ消費量が急激に増加し、メモリ不足の警告が表示されるか、アプリケーションがクラッシュすることがあります。

私はUIViewController配列を使用しようとしましたが、コントローラーを切り替えていました.何も変わらず、メモリ不足の警告が表示されます..

どうにかしてメモリをきれいにする必要があるのでしょうか?しかし、どのように?ARC では release などの使用は許可されていません。

新しいサブビューを追加する前に最後に試したこと(申し訳ありませんが、あまり専門的ではないかもしれません)はこれです

NSArray *viewsToRemove = [self.view subviews];
                    for (UIView *views in viewsToRemove) {
                        [views removeFromSuperview];
                    }

しかし、これも役に立ちません。

編集: 1 つのことを明確にする必要があります: アプリケーションの実行中に各 UIView が必要です。これは、アプリケーションが終了する前にそれを解放できないことを意味します。

EDIT2: コードは、実際のコードにより似たように編集されます。

4

4 に答える 4

0

いくつかの考え:

まず、testImgView を作成しないため、コピーされたコードに何か問題があります。それ以外の

testImgView.image = testImg;

あなたが必要

testImgView = [UIImageView viewWithImage:image];

次に、レイヤ アニメーションに入る必要はありません。 代わりにこのコードを参照してください...

[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:1.0];
[UIView setAnimationTransition: 110 forView:view cache:NO];  //110 for ripple effect
[UIView commitAnimations];

3 番目に、タグを使用して viewDidLoad にすべてのビューを追加し、可視に設定するだけです。

于 2012-08-28T22:34:16.343 に答える
0

If it's getting worse each time a transition occurs, you might try removing the animations from the layer when you remove from the superview.

NSArray *viewsToRemove = [self.view subviews];
                    for (UIView *views in viewsToRemove) {
                        [views removeFromSuperview];
                        [views.layer removeAllAnimations];
                    }
于 2012-08-29T01:16:39.667 に答える
0

ビューを保存するために NSMutableArray を使用しないのはなぜですか? はるかに簡単で、あえて言えば、はるかに安全です。

また、スーパービューからそれらを削除すると、配列からも削除されます

原則として、配列に格納すると保持され、削除すると解放されることに注意してください。そのため、配列に格納してからサブビューとして追加すると、保持カウント +2 になります。次に、それをスーパービューから削除します (保持数 -1) が、まだ配列にあるため、まだ正になります。

于 2012-08-28T21:41:45.930 に答える
-1

このような配列構造を使用する場合 (私は ivar と仮定しています)、ARC は、含まれているオブジェクトの構造がなくなったときにビューを解放する必要があることを実際には知りません。メソッドでクリーンアップするときは-dealloc、配列を反復処理して各要素を nil に設定するだけで、ARC はそのビューを解放しても問題ないことを認識します。もう 1 つのオプションはFoundation、 などのコレクション タイプを使用NSMutableArrayしてビューを保持することです。これにより、それらをクリーンアップすることを覚えておく必要がなくなります。

例えば:

- (void)dealloc
{
  for( int i = 0; i < 10; i++ )
    myviews[i] = nil;
}

アプリケーションの有効期間中に、新しいビューをこの配列に割り当てても問題ありません。ARC は正しいことを行います。でそれらを nil していることを確認してください-dealloc。同じ方法、つまり、配列を繰り返し処理し、各要素に nil を代入することで、それらの処理が完了していることがわかっている場合は、それらを早期に解放することもできます。

于 2012-08-28T21:51:32.763 に答える