2010-11-26 18 views
0

親愛なることに、私は約60のUIControllerViewsを持つナビゲーションベースのアプリを4つのセクションに分けています。iphoneアプリはメモリ不足のためクラッシュしますが、シミュレータで正常に動作します

私は以下を実行しました:1.ビルドと分析:bulidは問題なしで成功しました。 2.機器の割り当てとリーク:リークはありません。

しかし、アプリはiPhoneやiPadでクラッシュしましたが、シミュレータで正常に動作します。クラッシュレポートはありませんが、crashreporterフォルダにLowMemory.logがあります。

私は誰が間違っている可能性がどのような考えを持っています4.2

に私のiPhoneとiPadをアップグレードしましたか?私は一週間読んでトラブルシューティングをしています。

UIControllerViewsを削除/解除する必要はありますか? ビュー間を移動するだけでアプリがクラッシュします。

ありがとうございました。

私のアプリにはcontentViewControllerというルートビューがあり、ここから4つのクイズに移動できます。

これはルートビューに戻るためのコードです。

- (void)goHome { 
UIAlertView *alert = [[UIAlertView alloc] 
         initWithTitle: @"Warning" 
         message: @"Proceed?" 
         delegate: self 
         cancelButtonTitle:@"Yes" 
         otherButtonTitles:@"No",nil]; 
[alert show]; 
[alert release]; 

}

- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex { 
[[self navigationController] setNavigationBarHidden:NO animated:YES]; 
if (buttonIndex == 0) { 
    NSArray * subviews = [self.view subviews]; 
    [subviews makeObjectsPerformSelector:@selector(removeFromSuperview)]; 
    self.view = nil; 
    if (self.contentViewController == nil) 
    { 
     ContentViewController *aViewController = [[ContentViewController alloc] 
                initWithNibName:@"ContentViewController" bundle:[NSBundle mainBundle]]; 
     self.contentViewController = aViewController; 
     [aViewController release]; 
    } 
    [self.navigationController pushViewController:self.contentViewController animated:YES]; 
} 
else { 
} 

}

+0

プッシュした後にプッシュするビューコントローラを解放していますか?ビューコントローラをどのようにプッシュするかのコードサンプルが参考になります。 –

+0

毎回同じ場所や別の場所でクラッシュしますか?デバッグ中にクラッシュしますか?またはデタッチしたときのみ? – MCannon

+0

デバッグモードですぐにクラッシュします。 デタッチされたとき、通常は50ビューまでナビゲートした後、ランダムにクラッシュします。 – Ian

答えて

1

あなたのXcodeのコンソールを見てください。多くのメモリ不足警告を受け取っている場合は、デバイス上でメモリを過剰に占有しているため、ビューを即時に割り当ておよび割り当て解除する必要があります(シミュレータはメモリが制限されていません)。

しかし、それはあなたのクラッシュを引き起こす約100万の他のものになる可能性があります。デバッガが起動し、スタック上でクラッシュが発生している場所を確認できるように、デバッグビルド(ブレークポイントをオンにする)を行っていることを確認してください。

3

シミュレータは、メモリ警告に関する有用な情報を提供しません。そこで実行されるアプリケーションは、システムが提供するすべてのメモリに効果的にアクセスします。このデバイスはメモリ使用量をテストする必要がある場所で、警告やクラッシュが発生している場合は、メモリの一部を解放できる場所を特定するためにInstrumentsの作業を行う必要があります。

0

あなたは既に良い提案があります。しかし、私はXcodeのデバッグツールのドキュメントを見直す時間を費やすことを提案します。これにより、あなたは自分ができることとその使い方を基本的に理解することができます。それに続いて、iOSメモリ管理、自動解放プールなどの情報を読んでください。

iOSデバイスにスワップスペースがないことを認識する必要があります。したがって、他のプラットフォームでは必要ない程度にメモリを管理することが強制されます。一般的には、避けることができれば、メモリ内のデータを大量に表示したくないということです。

現在のiPadの場合、アプリには約110MBのRAMしかない場合があります。特定の数字はおそらくiOSのバージョンに依存します。いずれにしても、(メモリ内の)データ構造の大きさがさまざまな見解に適しているかどうかを知る必要があります。あなたがそれを正しく管理していないと、非常に素早く使い果たされる可能性が高いため、60種類のビューがメモリ使用量によって大きく異なると見なすことができます。これは、Javaや他のガベージ・コレクション言語でのプログラミングに似ていません。

最後に、これはメモリ管理の問題のように聞こえるが、いつも別のものになる可能性がある。それでも問題が解決しない場合は、コードを投稿する必要があります。今、私たちの仕事は本当にうまくいくと思います。あなたはVMを持っておらず、ガベージコレクションがないことを覚えておいてください。

+0

すべての返信ありがとうございます。あなたのレビューのために上記のコードをいくつか掲載しました。 – Ian

0

メモリを使用していますが、メモリを割り当てる必要がある場合は必ず解放しなければならないことを覚えておいてください。場合によっては自動解放を使用できるため、終了前にvoid deallocメソッドの後で解放することを忘れてしまいます。

関連する問題