2016-05-25 11 views
1

このルーチンを呼び出してCIImageを作成すると、タイトルにmallocエラーが発生します。 initWithBitmapDataを直接呼び出すと(createClUimageFromDataルーチン内ではない)、正常に動作します。initWithBitmapDataを呼び出すとMallocポインタが解放されませんでした

iOSの関連する可能性のあるバグを参照していますが、私は確信が持てません。

私の推測は、何とか私の追加のリダイレクトが問題を引き起こしていますが、必要な場所にコードを埋め込むよりもはるかに明確なルーチンを持っています。

ありがとうございます。

の失敗:

- (CIImage *) createCIimageFromData : (unsigned char *)pData width : (int32_t)width height : (int32_t)height 
{ 

    /* 
    Once we have the raw data, we convert it into a CIImage. 
    The following code does the required work. 
    */ 
    NSLog(@"entering createciimage\n"); 
    CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceGray(); 

    NSData *_pixelsData = [NSData dataWithBytesNoCopy:pData length:(sizeof(unsigned char)*width*height) freeWhenDone:YES ]; 
    CIImage *_dataCIImage = [[CIImage alloc] initWithBitmapData:_pixelsData bytesPerRow:(width*sizeof(unsigned char)) size:CGSizeMake(width,height) format:kCIFormatR8 colorSpace:colorSpaceRef]; 

    CGColorSpaceRelease(colorSpaceRef); 

    /* 
    newImage is the final image 
    Do remember to release the allocated parts. 
    */ 
    NSLog(@"done ciimage\n"); 
    return _dataCIImage; 
} 

作品:NSDataオブジェクトはデータを解放しようとしたときに

void prepData(unsigned char *pData, // source-destination 
          int strideSrc, // stride 
          int width, 
          int height, 
          double amount, 
          int deltaLimit, 
          id owner) 
{ 

    //[owner createCIimageFromData:pData width:width height:height]; // <-- commented out 
    CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceGray(); 

    NSData *_pixelsData = [NSData dataWithBytesNoCopy:pData length:(sizeof(unsigned char)*width*height) freeWhenDone:YES ]; 
    CIImage *_dataCIImage = [[CIImage alloc] initWithBitmapData:_pixelsData bytesPerRow:(width*sizeof(unsigned char)) size:CGSizeMake(width,height) format:kCIFormatR8 colorSpace:colorSpaceRef]; 

    CGColorSpaceRelease(colorSpaceRef); 

// . . . 
} 
+0

'freeWhenDone:NO'を試してみて、' CIImage'を終えたらデータを解放してください。 – user3386109

+0

ありがとう、それは仕事をしたようだ!答えとして追加すると、これが答えであることが示されます。 – user938797

+0

@ user938797誰かがあなたに言うことができるのを待ってみましょう***なぜ***これが答えです。私はちょうど推測していた:)それは問題の原因となるシーンの裏に何が起こっているのか知ることは有益だろう。だから私たちはすべて将来避けなければならないことを知っている。 – user3386109

答えて

1

明らかに問題が発生しています。この問題を回避するには、freeWhenDone:NOを使用してから、CIImageを実行した後でデータを解放してください。

+0

'NoCopy'メソッドの問題(' freeWhenDone'に関係なく)は 'pData'が指し示し、' NSData'オブジェクトが参照するデータバッファがその 'NSData'オブジェクトの長さだけ存続していることを確認する必要がありますこれはおそらく 'CIImage'によって保持されています。だから、それは 'CIImage'のように長く生きなければなりません。そして、どちらも参照カウントされているので、どれだけ長く生きるかは分かりません。彼らはあなたが最後に強い参照をリリースしたときに過去に生きることができます。なぜなら、これまでに通過したコードは何らかの理由でそれらを保持できるからです。 –

+0

Ken Thomasesにも感謝します。 – user938797

関連する問題