FILE *file = fopen([gpsFilePath UTF8String], "r");
char c[1024];
while(fgets(c, 1024, file)!=NULL)
{
NSString *cString = [[NSString alloc] initWithCString:c
encoding:NSMacOSRomanStringEncoding];
NSArray *split = [cString componentsSeparatedByString:@","];
if ([split count] != 3)
{
continue; //this should only happen on the first line
}
gpx = [gpx stringByAppendingString:[NSString stringWithFormat:@" <trkpt lat=\"%@\" lon=\"%@\"></trkpt>\n\n", [split objectAtIndex:0], [split objectAtIndex:1]]];
}
答えて
他の人が指摘しているように、多くの一時的なオブジェクトを作成しています。ひどい。その上、一時オブジェクトのサイズは、少なくともgpx
で、ループの各パスで増加しています。この例では、gpsFilePath
で何の内容を読み込み、改行でそれを分割し
NSMutableString *gpx = [NSMutableString string];
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
for(NSString *line in [[NSString stringWithContentsOfFile:gpsFilePath usedEncoding:NULL error:NULL] componentsSeparatedByString:@"\n"]) {
NSArray *split = [line componentsSeparatedByString:@","];
[gpx appendFormat:@" <trkpt lat=\"%@\" lon=\"%@\"></trkpt>\n\n", [split objectAtIndex:0], [split objectAtIndex:1]];
}
[pool release];
pool = NULL;
:あなたのような何かをしようとする場合があります。次に、各行に対してコンマで区切り、結果を可変文字列gpx
に追加します。多くの一時オブジェクトを作成する処理部分を自動解放プールにラップするので、できるだけ早く破棄されます。
最後に、変数gpx
に処理結果が含まれます。
1024より大きいチャンクを使用できますか?
ファイルの各行に複数のオブジェクトを割り当てていますが、オートリリースプールに追加されているため解放されず、オートリリースプールには排水する機会がありません。いくつかの反復回数ごとに排水するオートリリースプールを追加してください:
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
FILE *file = fopen([gpsFilePath UTF8String], "r");
char c[1024];
int line = 1;
while(fgets(c, 1024, file)!=NULL) {
NSString *cString = [[NSString alloc] initWithCString:c encoding:NSMacOSRomanStringEncoding];
NSArray *split = [cString componentsSeparatedByString:@","];
if ([split count] != 3) { continue; } //this should only happen on the first line
gpx = [gpx stringByAppendingString:[NSString stringWithFormat:@" <trkpt lat=\"%@\" lon=\"%@\"></trkpt>\n\n",
[split objectAtIndex:0],[split objectAtIndex:1]]];
if(line % 1000 == 0) // drain the pool every 1000 iterations
{
[pool release];
pool = [[NSAutoreleasePool alloc] init];
}
line++;
}
[pool release];
ええと、私はこのコードを使ってプールを解放すると、すぐにクラッシュするEXC_BAD_ACCESS –
"プール"に何も追加していません。それは普通ですか? – simao
自動解放プールを使用している場合は、gpxを保持/解放する必要があるようです。自動リリースされたオブジェクトを使用せずにループを書き直してみてください。 –
cString
をリリースまたは自動リリースせずに割り当てています。あなたがそれを完了したら、毎回[cString release]
を行う必要があります。
また、他のものと同じように、独自の自動解放プールを使用し、毎回新しい文字列を作成するのではなく、既存のgpx
に追加する必要があります。
- 1. このコードはどこで改善できますか?
- 2. このクエリを改善することはできますか?
- 3. FlashでAJAXを改善することはできますか?
- 4. ジェネリックはこのデザインを改善できますか?
- 5. 検証を改善することはできますか?
- 6. 改善することはできますか?
- 7. このテーブルスキーマは1NFに正規化されていますか?どこで改善できますか?
- 8. java.lang.String.concatを改善できますか?
- 9. このlinq-to-xmlメソッドのパフォーマンスを改善できますか?
- 10. このSQLクエリのパフォーマンスを改善できますか?
- 11. このスクリプトをどのように改善できますか?
- 12. このjQueryを改善しますか?
- 13. このスクリプトを改善できますか?
- 14. このJQueryイメージ置換コードを改善できますか?
- 15. このPythonスクリプトを改善できますか?
- 16. このコードを改善できますか?
- 17. このクエリを改善できますか?
- 18. このPHPコードを改善できますか?
- 19. このループを改善するアイデアは可能ですか?
- 20. すべてのiphoneシミュレータはどこに消えますか?
- 21. なぜこのParallel.ForEachループはパフォーマンスを改善していませんか?
- 22. %C whileループで改行を維持していますか?
- 23. このPHPコードを簡略化または改善できますか?
- 24. iPhone - テキストビュー内の改行を<br />に置き換えていますか?
- 25. angle2のasyncPipeでUIのパフォーマンスを改善できますか?
- 26. Firebaseの構造を改善することはできますか?
- 27. 下のコードでさらに改善ができますか?
- 28. mongodb:シャーディングはクエリのパフォーマンスを改善できますか?
- 29. Azure DocumentDB - カスタムインデックス作成でインサートの料金を改善できますか?私は挿入しています
- 30. whileループなしで次のクエリを記述して効率を改善できますか?
それは私だけですか、それとも怪しいほど読めないようですか? – EFraim
私にとって、Objective-Cはすべてそのように見えます。 – Nosredna
私はPythonの男です.JavaScriptなので、私はあなたに同意する傾向があります。しかし、あなたはそれに慣れています。大括弧はピリオドのようなものであり、より明確になります。また、これは普通のC言語で混在するのに役立ちません。 –