2016-10-11 15 views
0

私は、デバイスに(base64文字列からUIImageに変換された)いくつかのイメージをダウンロードして保存しようとしていて、メモリ警告を受け取り続けています。Objective-c UIImagePNGRepresentationがメモリリークの原因となる

ontracFullScreenImageViewController *etrackDiagrams = ((ontracFullScreenImageViewController*)[viewControllerDictionary objectForKey:@"E-track Diagrams"]); 
    NSMutableSet *etrackSet = [[NSMutableSet alloc] init]; 

    for (UIImage *image in etrackDiagrams.imageArray) { 


     NSAutoreleasePool *localPool = [[NSAutoreleasePool alloc] init]; 
     //convert the image to NSData and store it in the documents directory 
     NSData *pngData = UIImagePNGRepresentation(image); 
     NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
     NSString *documentsPath = [paths objectAtIndex:0]; //Get the docs directory 
     NSString * timeInMS = [NSString stringWithFormat:@"%lld", [@(floor([[NSDate date] timeIntervalSince1970] * 1000)) longLongValue]]; 
     NSString *filePath = [documentsPath stringByAppendingPathComponent:[ NSString stringWithFormat:@"%@_%@_etrack_diagram_%i_%i_image.png", delegate.userName, timeInMS, self.dataObject.dataPack.pack_id, [etrackDiagrams.imageViewArray indexOfObject:image]]]; //Add the file name 
     [pngData writeToFile:filePath atomically:YES]; 
     NSLog(@"filepath %@", filePath); 
     NSString *currSysVer = [[UIDevice currentDevice] systemVersion]; 
     if ([currSysVer isEqualToString:@"5.0.1"]) { 
      [[NSURL URLWithString:filePath] setResourceValue: [NSNumber numberWithBool: YES] forKey: NSURLIsExcludedFromBackupKey error: &error]; 
     } 
     //Add the file Path to ImageLinks 
     [etrackDiagrams.imageLinks addObject:filePath]; 
     //save the image location in Core Data 
     EtrackDiagram *etrackDiagram = [NSEntityDescription 
             insertNewObjectForEntityForName:@"EtrackDiagram" 
             inManagedObjectContext:context]; 
     etrackDiagram.locationString = filePath; 
     etrackDiagram.dataObject = dataObject; 
     [etrackSet addObject:etrackDiagram]; 
     [dataObject addEtrackDiagramsObject:etrackDiagram]; 
     [localPool drain]; 

    } 
    [dataObject addEtrackDiagrams: etrackSet]; 

メモリ警告は、画像がかなり大きいため、NSData *pngData = UIImagePNGRepresentation(image);で発生します。

残念ながら、画像のサイズを制御することはできませんが、後でギャラリーで使用するために画像をデバイスに保存する方法が必要です。

私は@autoreleasepoolでコードをラップしようとしましたが、違いはありません。

for (UIImage *image in etrackDiagrams.imageArray) { 

これは、あなたがメモリ内の画像の配列を保持している意味:

+0

@autoreleasepoolでコードを折り返してみてください。http://stackoverflow.com/a/9779032/1689376 – alexburtnik

+0

@alex私はすでに成功していません。それに応じて私の質問を更新しました – jampez77

答えて

1

本当の問題は、このラインです。それは常に危険です。これらのイメージをすべてディスクに保存して、一度に1つずつ(およびキャッシュしないで)メモリにロードする必要があります。あなたの目標は、一度に1つのイメージを最大で1つのメモリに保存することです。

+0

あなたはここで良い点があります。私が今やったことは、URLから取得したイメージを保存しようとしています(個別に)。まだ喜んではありません:/ – jampez77

+0

イメージが取り出されるときにイメージがディスクに保存されている場合、なぜPNGデータに変換する必要がありますか?それはデータです。それが保存されます。それはパスを持っています。完了しました。 – matt

+0

これは、ギャラリーで使用できるように、pngに変換するbase64文字列です。 – jampez77

0

マットの理論が間違っていたことを証明するコードはここにあります。

for(NSInteger i =0; i < etrackDiagrams.imageArray.count; i ++) { 
    UIImage *image = etrackDiagrams.imageArray[i]; 
    // here is your code to save image in device. 
} 

「(imagearrayでuiimage *画像)について」であれば、その後上記のコードは、問題を修正します、メモリ内の画像の配列を保持しているが、実際には、任意の助けを借りずに、基本的です。

メモリ警告はNSData * pngData = UIImagePNGRepresentation(image)で発生します。画像がかなり大きいためです。私はこのメッセージがとても重要だと思います!

ここに誰かが同じ問題を抱えています。 click here

0

たぶん、あなたの心に変更することができます:あなたはbase64文字列をダウンロードするとき

  1. は、NSDataのに変換し、その後、あなたの配列に追加します。
  2. イメージデータを保存する場合は、配列内のnsdataを選択します。

一部のビューで画像を表示しない場合は、 に注意する必要はありません。メモリ警告が発生します。

関連する問題