0

次のコードがクラッシュします。基本的に、ファイルとして保存された非常に大きな文字列(xml-画像データを含む)にアクセスしています...それを変更して新しい名前で保存しています...プロファイリング時に、このコードでリークは見られませんでした。 ..しかし、このプロセスを20〜25回繰り返した後、アプリはメモリ警告レベル3のiphone 3gsでクラッシュし、実行中のアプリ全体も強制終了します...このアプリがリークして原因となる場所が見つかりませんメモリ警告....任意の提案

NSAutoreleasePool *pool=[[NSAutoreleasePool alloc] init];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
 NSString *documents = [paths objectAtIndex:0];
 NSString *filename = [NSString stringWithFormat:@"%@.yyy",fileToDuplicate];
 NSString *initPath = [documents stringByAppendingPathComponent:filename];
 NSString *final = [NSString stringWithFormat:@"%@.yyy",[[alertView textFieldAtIndex:0] text]];
 NSString *finalPath = [documents stringByAppendingPathComponent:final];
 NSString *newName=[[[alertView textFieldAtIndex:0] text] copy];
 NSError *error;
 NSString *xml = [[NSString alloc] initWithContentsOfFile:initPath encoding:NSASCIIStringEncoding error:&error] ;
 NSString *xml_1=[xml stringByReplacingOccurrencesOfString:[NSString stringWithFormat:@"<file_name><name>%@.yyy</name></file_name>",fileToDuplicate] withString:[NSString stringWithFormat:@"<file_name><name>%@.yyy</name></file_name>",newName]];
NSString *xml_2=[xml_1 stringByReplacingOccurrencesOfString:[NSString stringWithFormat:@"<property_name>%@</property_name>",fileToDuplicate] withString:[NSString stringWithFormat:@"<property_name>%@</property_name>",newName]];
[xml_2 writeToFile:finalPath atomically:YES encoding:NSASCIIStringEncoding error:&error];
 xml=nil;
 [xml release];
 xml_1=nil;
 xml_2=nil;
 [self.mTableView reloadData];
 fileToDuplicate=@"";
 [newName release];
 [pool drain];
 return ;
4

2 に答える 2

4

これがどこに漏れているかわからない場合は、ARCに切り替えてください。それは真ん中の日と同じくらい明確です:

Allocxml

変数xmlをnilに設定します(LEAK !!!!!)

(nil)のコンテンツを解放するxml<---これは何もしません

最後の2つは逆になります。nilに設定するに、リリースする必要があります。この概念を理解していない場合は、ポインターについてもう少し読むことをお勧めします。リリースメッセージは、ポインタ自体ではなく、ポインタの内容に作用します。後者は意味がありません。

于 2012-07-22T02:06:54.047 に答える
1

あなたの問題はこのコードです:

 xml=nil;
 [xml release];

解放する前に解放したい変数を何も設定していません...オブジェクトをnilに設定した場合、そのオブジェクトを指していたポインタはもはやそれを指していません。これで、解放するオブジェクトへの参照がなくなりました。そのため、この場合、メモリリークが発生します。コードは次のようになります。

 [xml release];
 xml=nil;
于 2012-07-22T04:51:33.970 に答える