0

いくつかの画像 (base64 文字列から UIImage に変換されたもの) をデバイスにダウンロードして保存しようとしていますが、メモリ警告が表示され続けます。

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たが、違いはありませんでした。

4

3 に答える 3

0

これは、マットの理論が間違っていたことを証明するコードです。

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

「for(uiimage *image in imagearray)」がメモリに画像の配列を保持している場合、上記のコードで問題は解決しますが、実際には基本的に何の助けもありません。

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

ここに誰かが同じ問題を抱えていました。ここをクリック

于 2016-10-11T13:57:25.680 に答える
0

多分あなたは気が変わることができます:

  1. base64 文字列をダウンロードしたら、それを nsdata に変換してから、配列に追加します。
  2. imagedata を保存する場合は、配列で nsdata を選択します。

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

于 2016-10-11T14:42:44.407 に答える