2009-07-22 1 views
0
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]]]; 
} 
+1

それは私だけですか、それとも怪しいほど読めないようですか? – EFraim

+4

私にとって、Objective-Cはすべてそのように見えます。 – Nosredna

+0

私はPythonの男です.JavaScriptなので、私はあなたに同意する傾向があります。しかし、あなたはそれに慣れています。大括弧はピリオドのようなものであり、より明確になります。また、これは普通のC言語で混在するのに役立ちません。 –

答えて

3

他の人が指摘しているように、多くの一時的なオブジェクトを作成しています。ひどい。その上、一時オブジェクトのサイズは、少なくとも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に処理結果が含まれます。

0

1024より大きいチャンクを使用できますか?

1

ファイルの各行に複数のオブジェクトを割り当てていますが、オートリリースプールに追加されているため解放されず、オートリリースプールには排水する機会がありません。いくつかの反復回数ごとに排水するオートリリースプールを追加してください:

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]; 
+0

ええと、私はこのコードを使ってプールを解放すると、すぐにクラッシュするEXC_BAD_ACCESS –

+0

"プール"に何も追加していません。それは普通ですか? – simao

+0

自動解放プールを使用している場合は、gpxを保持/解放する必要があるようです。自動リリースされたオブジェクトを使用せずにループを書き直してみてください。 –

1

cStringをリリースまたは自動リリースせずに割り当てています。あなたがそれを完了したら、毎回[cString release]を行う必要があります。

また、他のものと同じように、独自の自動解放プールを使用し、毎回新しい文字列を作成するのではなく、既存のgpxに追加する必要があります。

関連する問題