2016-06-21 6 views
0

私のiPhone 4には、次のような状況で警告メッセージが表示されます: Amazon S3を使用しています。私は、次のコードでNSMutableDataに私の選択した画像を変換しています:私はループでこれを実行するとメモリリークを取得する - NSData変換

CGImageSourceRef source = CGImageSourceCreateWithData((__bridge CFDataRef)imageData, NULL); 

CFDictionaryRef options = (__bridge CFDictionaryRef)@{(id)kCGImageSourceCreateThumbnailWithTransform: (id)kCFBooleanTrue, 
                 (id)kCGImageSourceCreateThumbnailFromImageIfAbsent: (id)kCFBooleanTrue, 
                 (id)kCGImageSourceThumbnailMaxPixelSize: [NSNumber numberWithDouble: maxSize], 
                 (id)kCGImageDestinationLossyCompressionQuality: [NSNumber numberWithDouble:compressionQuality]}; 

CGImageRef thumbnail = CGImageSourceCreateThumbnailAtIndex(source, 0, options); // Create scaled image 

CFStringRef UTI = kUTTypeJPEG; 
NSMutableData *destData = [NSMutableData data]; 
CGImageDestinationRef destination = CGImageDestinationCreateWithData((__bridge CFMutableDataRef)destData, UTI, 1, NULL); 
if (!destination) { 
    NSLog(@"Failed to create image destination"); 
} 
CGImageDestinationAddImage(destination, thumbnail,(__bridge CFDictionaryRef)metadata); // copy all metadata in source to destination 
if (!CGImageDestinationFinalize(destination)) { 
    NSLog(@"Failed to create data from image destination"); 
} 

if (!destination) CFRelease(destination); 
CFRelease(source); 
CFRelease(thumbnail); 

return [destData copy]; 

は、なぜ私は24日、画像の後にメモリの警告を取得していますか?

+0

iPhone4のは、すでにそれは他の機器で起こっているとあなたがサーバに画像をアップロードするために他の技術を使用するように開いている、非常に低いメモリを持っていますか? –

+0

ありがとうSaheb、はい、この問題に直面しているのはiPhone 4のみです。 bcoz iPhone 6とiPhone 5でも試したことがありますが、画像の数が50以上の画像が正しく表示されています。それはメモリレベルで修正することが可能です – vetrivel

答えて

0

このイメージをメモリ全体にロードするので、メモリの問題が発生します。通常は、画像をDocumentディレクトリに保存し、画像のPATHを使用して複数の画像をアップロードします。 それは画像をマルチパートとしてロードするだけなので、メモリの問題は問題にならないでしょう。これがあなたがやっていることに当てはまるかどうかはわかりません。

お知らせください。

+1

それは良い提案ですが、実際に質問されている質問には答えません。 – Droppy

2

このコードにはリークがあります。

は具体的に、あなたが言うラインを持っている:

それはあなたが意図したものかの反対で NULL、ある場合にのみ、それを解放します
if (!destination) CFRelease(destination); 

:ところで

if (destination) CFRelease(destination); 

shift + コマンド + Bを押すと、Xcodeはコードの静的解析を行います。この問題について(コード内のいくつかの他の問題と同様に)あなたに話してくれたでしょう。これらの問題を見つけることは非常にうまくいきます。


私は何かのように提案するかもしれません:

- (NSData * _Nullable)processImageData:(NSData *)imageData maxSize:(double)maxSize compressionQuality:(double)compressionQuality metadata:(NSDictionary *)metadata { 
    CGImageSourceRef source = CGImageSourceCreateWithData((__bridge CFDataRef)imageData, NULL); 

    CFDictionaryRef options = (__bridge CFDictionaryRef)@{(id)kCGImageSourceCreateThumbnailWithTransform: (id)kCFBooleanTrue, 
                  (id)kCGImageSourceCreateThumbnailFromImageIfAbsent: (id)kCFBooleanTrue, 
                  (id)kCGImageSourceThumbnailMaxPixelSize: [NSNumber numberWithDouble: maxSize], 
                  (id)kCGImageDestinationLossyCompressionQuality: [NSNumber numberWithDouble:compressionQuality]}; 

    CGImageRef thumbnail = CGImageSourceCreateThumbnailAtIndex(source, 0, options); // Create scaled image 

    CFRelease(source); 

    CFStringRef UTI = kUTTypeJPEG; 
    NSMutableData *destData = [NSMutableData data]; 
    CGImageDestinationRef destination = CGImageDestinationCreateWithData((__bridge CFMutableDataRef)destData, UTI, 1, NULL); 
    if (!destination) { 
     NSLog(@"Failed to create image destination"); 
     destData = nil; 
    } else { 
     CGImageDestinationAddImage(destination, thumbnail,(__bridge CFDictionaryRef)metadata); // copy all metadata in source to destination 
     if (!CGImageDestinationFinalize(destination)) { 
      NSLog(@"Failed to create data from image destination"); 
      destData = nil; 
     } 
     CFRelease(destination); 
    } 

    CFRelease(thumbnail); 

    return [destData copy]; 
} 
+1

ロギングの失敗は実際には他のアクションを取らないと、そのコードでも災害につながります。 – Droppy

+0

合意。最低でも、彼は間違いで 'nil'を返すべきです。正確に修正された修正版のコードスニペットを参照してください(また、元のコードスニペットの他のいくつかの問題を修正しています)。 – Rob

+0

メモリリークの発見に役立つ "Intruments Leaks"を追加することをお勧めします。メモリ圧が常にリークを意味するわけではないので、その場合、「Instruments Allocation」が助けになるかもしれません。 – Larme

関連する問題