2009-03-17 11 views
0

私は、誰かがiPhoneのメモリに関する問題で私を助けてくれることを望んでいました。autorelease pool

私はnavコントローラの一部であるスクロールビューを持っています。

私が最初にnavコントローラを押してスクロールビューをスクロールすると(画像が追加されると)、メモリは巨大な塊(それぞれ1mb)で割り当てられます。

ディスプレイを数回回転させると、メモリが解放され、すべて正常です。スクロールビューが正常に動作し、メモリが元の場所に戻ります(約1Mb、計測器のNetアロケーションを参照)。

メモリをワイルドにしないようにするにはどうすればいいですか?スクロールビューの使用中にメモリを解放するにはどうすればできますか?ここで

はscrollviewのページをロードするために呼び出されるコードスニペットです:

- (void)loadPage:(int)page isCurrent:(BOOL)isCurrent { 
if (page < 0) return; 
if (page >= totalRows) return; 
picViewController *controller = [[picViewController alloc] init]; 
if ((NSNull *)[viewControllers objectAtIndex:page] == [NSNull null]) { 
     NSString *fullPath = [self fullPath]; 
    if([fileManager fileExistsAtPath:fullPath]) { 
     currentImage=[UIImage imageWithContentsOfFile:fullPath]; 
     [controller setImg:currentImage]; 
     [viewControllers replaceObjectAtIndex:page withObject:controller]; 
    } 
    else { 
      AsyncImageView* asyncImage = [[AsyncImageView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]]; 
      asyncImage.tag = 8; 
      [asyncImage loadImageFromName:imageName withURL:url]; 
      [controller.view addSubview:asyncImage]; 
      [asyncImage release]; 
      [viewControllers replaceObjectAtIndex:page withObject:controller]; 
     } 
     if (nil == controller.view.superview) { 
      CGRect frame = scrollView.frame; 
      frame.origin.x = frame.size.width * page; 
      frame.origin.y = 0; 
      controller.view.frame = frame; 
      [scrollView addSubview:controller.view]; 
     } 
    [controller release]; 
    } 

}

答えて

0

コード内で実際に画面外のページをパージしている場所はわかりません。

あなたのコードはAppleのPageControlの例のようです。

私がしていることは、ページが「アクティブになる」たびにページをループして、1ページまたは2ページ以上離れたページをパージすることです。 (バウンススクロール、とのための2なしのための1。)

- (void)updateCachedPages { 
    int active = pageControl.currentPage; 
    int count = pageControl.numberOfPages; 
    for (int i = 0; i < count; i++) { 
     if (abs(active - i) <= 2) { 
      [self loadPage:i]; 
     } 
     else { 
      [self purgePage:i]; 
     } 
    } 
} 

- (void)purgePage:(int)page { 
    if ((page < 0) || (page >= [_myObjects count])) return; 

    MyControllerClass *controller = [_viewControllers objectAtIndex:page]; 
    if ((NSNull *)controller != [NSNull null]) { 
     [_viewControllers replaceObjectAtIndex:page withObject:[NSNull null]]; 
     //NSLog(@"Purged page %d", page); 
    } 
} 

scrollViewDidEndDeceleratingのCall updateCachedPages、あなたのPageControlのページ変更アクション、およびviewWillAppear

+0

こんにちはあなたのupdateCachedPagesメソッドを実装する必要があります –

0

は、メモリの低い通知にあなたのコントローラの注意を払っていますか?受け取ったときに表示されない画像や、関連性があると思われる他の画像をフラッシュできます。

0

OK、私はすべてのメモリを結局解放していませんでした。

クラスインスタンスが正しく解放されず、tewhaのパージコードが正常に動作していることが確認されたら、すべてがゴールです。

クイックヘルプありがとうございます。このフォーラムは素晴らしかったです。

+0

未回答のリストに表示されないように質問を閉じる必要があります。 –

関連する問題