0

このコードでは、100 回の繰り返しで 100 MB を超えるリークが発生します。[imageName release] と書くと、「割り当て解除されたインスタンスに送信されたメッセージ」でクラッシュします。何が問題の原因になるのかさえ考えられません。

NSString* imageName=[NSString stringWithUTF8String:(const char*)sqlite3_column_text(statement, 5)];
imageName =[imageName stringByReplacingOccurrencesOfString:@"-" withString:@"_"];
imageName =[imageName stringByReplacingOccurrencesOfString:@"." withString:@"-"];

[ret setQuestionImage:[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:imageName ofType:@"jpg"]]]; 
4

1 に答える 1

3

問題は、これらの便利なメソッドによって作成された文字列と画像が自動解放され、自動解放が十分に早く行われないことです。ただし、明示的に解放すると、自動解放時に二重に解放されます。すべての反復を自動解放プールにラップしてみてください。

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSString *imageName=[NSString stringWithUTF8String:(const char *)sqlite3_column_text(statement, 5)];
imageName = [imageName stringByReplacingOccurrencesOfString:@"-" withString:@"_"];
imageName = [imageName stringByReplacingOccurrencesOfString:@"." withString:@"-"];

[ret setQuestionImage:[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:imageName ofType:@"jpg"]]];
[pool release];
于 2012-07-30T10:19:07.237 に答える