2012-03-28 1 views
1

私のアプリがクラッシュした理由を知るのに多くの時間を費やしました。私のcount変数は、場合によっては正しく初期化されません。NSStringがバッファオーバーフローし、アプリケーションがクラッシュしました。デバッガにはスタックトレース情報は表示されません。しかし、なぜ?

NSStringがバッファをオーバーフローさせ、アプリケーションがクラッシュしました。デバッガにはスタックトレース情報は表示されません。しかし、なぜ?

int count = 2147483647; 
NSString *lines = @""; 
for(int i = 0; i < count; i ++) 
{ 
    lines = [NSString stringWithFormat:@"%@%@", lines, @"\n"]; 
} 

更新:デバッガでスタックトレース情報が表示されないのはなぜですか?

+0

がなぜ任意のスタックトレース情報を表示しデバッガないのですか? – Voloda2

答えて

2

長い文字列を作成するだけでなく、たくさんの文字列を作成しています。 +stringWithFormat:を呼び出すたびに、以前の文字よりも長い文字('\n')の新しい文字列が作成されます。これらの文字列はオートレリースされていますが、自動解放プールは決して流出しないので、@"\n"@"\n\n"@"\n\n\n"@"\n\n\n\n"などのような多くの文字列でメモリをいっぱいにしています。おそらく、それがNSStringに内部バッファーサイズ制限(存在する場合)に達する前にクラッシュするでしょう。あなたが得るどのくらい調べるため

+1

IIRC私の数学レッスンで、1文字== 1バイトと仮定すると、自動解放プールを排水する前に、メモリ内で(n *(n-1))/ 2バイトが必要です。 nはおよそ2e9なので、1e18バイトのRAMが必要です.1エクサバイトです。 :)夢を止める:) – Cyrille

1

使用この:

int count = 2147483647; 
NSString *lines = @""; 
for (int i = 0; i < count; i++) { 
    @try { 
     lines = [lines stringByAppendingString:@"\n"]; 
    } 
    @catch (NSException *ex) { 
     NSLog(@"end after %d loops (%@)", i, [ex description]); 
    } 
} 
+0

私はこのコードをデバイス上で実行しますが、試してみると機能しません。私は例外を持っていなかった、私のアプリがクラッシュした。 – Voloda2

+0

これはキャッチしませんが、エラーが発生します。*** mmap(サイズ= 16777216)が失敗しました(エラーコード= 12)***エラー:領域を割り当てることができません。あなたはXcodeのデバッグエリアでこれを取得していませんか? –

+0

私はXCode 4.1を使用しています。私は何の誤りもありません。あなたのXcodeのバージョンは何ですか? – Voloda2

関連する問題