1

別の.mファイルのイメージで処理しようとしています。現在のところ、以下は私のコードです。私は2つのUIImagesを格納し、2つを処理するグローバルなNSMutableArrayを持っています。ユーザーがボタンをクリックするたびに、2つの画像がグローバルアレイに保存され、それらを処理して要素を削除します。私はARCを使用しているので、私にはリリースは必要ありません。ARC GPUImageを使用したメモリリーク

@implementation 
NSMutableArray * imagesArray; 
ImageProcessor *imageProcessor; 
... 

- (void)viewDidLoad { 
imagesArray = [[NSMutableArray alloc] init]; 
imageProcessor = [[ImageProcessor alloc] init]; 
//some other code 
} 

-(UIImage*)processImages{//process images using GPUImage 
    UIImage *firstImg = [[imagesArray objectAtIndex:1] copy]; 
    UIImage *secImg = [[imagesArray objectAtIndex:0] copy]; 
    UIImage *processedImage = [imageProcessor flashSubtract:firstImg : secImg]; 
    UIImage *dividedImage = [imageProcessor referenceDivide:processedImage]; 
// [self uploadDropbox:UIImagePNGRepresentation(processedImage) : @"Output.png"];//try to save tiff files 
    //using ARC, no explicit memory releasing required 
    NSLog(@"image processed!"); 
    [imagesArray removeAllObjects]; 
    return dividedImage; 
} 

ImageProcessor.m:

#import "ImageProcessor.h" 

@interface ImageProcessor() 

@end 

@implementation ImageProcessor 

GPUImageSubtractBlendFilter *subFilter; 
GPUImageDivideBlendFilter* divFilter; 

-(id)init { 
    self = [super init]; 
    //initialize filters 
    subFilter = [[GPUImageSubtractBlendFilter alloc] init]; 
    divFilter = [[GPUImageDivideBlendFilter alloc] init]; 
    return self; 
} 

-(UIImage*)flashSubtract:(UIImage*) image1 : (UIImage*) image2{ 
    UIImage *processedImage; 
// @autoreleasepool { 

    //CAUSING MEMORY ISSUE 
    GPUImagePicture *img1 = [[GPUImagePicture alloc] initWithImage:image1];//image with flash 
    GPUImagePicture *img2 = [[GPUImagePicture alloc] initWithImage:image2];//image without flash 
    //MEMORY ISSUE END 

    [img1 addTarget:subFilter]; 
    [img2 addTarget:subFilter]; 

    [img1 processImage]; 
    [img2 processImage]; 
    [subFilter useNextFrameForImageCapture]; 
    processedImage = [subFilter imageFromCurrentFramebuffer]; 

// } 

    //consider modifications to filter possibly? 


    return processedImage; 
} 
@end 

私は[画像プロセッサflashSubtract]の後に、それはメモリを解放しないメモリリークの問題を取得しています。メモリ使用量が増え続け、約30枚の写真の後に、アプリケーションがクラッシュします。私が何か悪いことをしているかどうか教えてください。どんな助けでも大歓迎です。問題を特定するのに役立つことができ、

+0

申し訳ありません__weakでテストしていましたが、私は客観的なcをかなり新しくしているので、実際にはオプションを使い果たしていました。うん、私はnsmutable配列を使用するように感じるそれと何かを持っている可能性があります –

答えて

2

まず、私は静的アナライザ( - - コマンドBのXcodeの「製品」メニューの「分析」、またはシフトを押す)を介して、あなたのコードを実行することをお勧めしたいですObjective-Cコードで。続行する前に、アナライザーから健全な健康状態を確認してください。 ARCでは、ここに問題があまりないかもしれませんが、確認するだけです。確認するだけです。

第2に、リークレポートを取得したときに、それがリークの原因とは限りません。リークしたオブジェクトが最初に作成された場所を示しているだけなので、コードを調べて、その特定のオブジェクトがなぜ流出したのかを知ることができます。例えば、私が「リーク」による例を実行し、それがこのルーチンに私を監督:ひどく照明されていないことを

enter image description here

。漏れたものを知ることはうれしいことですが、漏れたオブジェクトが最初に割り当てられた場所だけでなく、なぜオブジェクトが漏れたのかを知ることができます。

しかし、アプリを(Instrumentsではなく単にデバッガで実行して)実行し、「Debug memory graph」ボタンenter image description hereをタップすると、左のパネルを見ると、どのオブジェクトが強い参照を維持しているかを見ることができます。この場合、私は私が誤って確立した強い基準周期見ることができます。この情報を

enter image description here

武装を、私はこれらの強い参照が確立された場所を追跡し、彼らはまだ存在している理由を把握することができます。または、この例では、なぜ私は強い参照サイクルを持っているのかを追跡し、その参照のうちのどれがweakである必要があるのか​​把握します。

+1

これは本当に役立った!ビルドアナライザーを実行して、CGImageRefオブジェクトなどのコアイメージオブジェクトを適切にリリースしていないことに気付きました。 ARCを有効にしていても、特定のCFRelease関数を使用してこれらを解放する必要があるようです。どうもありがとうございます! –

関連する問題