1

UIImage以下の関数では、作成されたポインターを返そうとしていますNSData

  1. オプションを指定すると、ここから返されfreeWhenDone = YESUIImage表示は白い画像です。
  2. 私がオプションを与えるときfreeWhenDone = NO

    • UIImageここで返されたフォームは、黒いイメージとして表示されます。
    • rgb_bufferfunction1 と function2の代わりに (char array)を渡す[rgbData bytes]と、正しく機能します。すべて順調。

ARCと関係あるの?

Myfunction
{
    char *pu1_out_buffer = malloc(length);
    int width, height, stride;
    char *rgb_buffer = malloc(BUFFER_LENGTH);
pu1_out_buffer = datafromfile(FILE_PATH)  // initialized with some data , not important

/* rgb NSdata created from malloced rub buffer */
    NSMutableData *rgbData = [NSMutableData dataWithBytesNoCopy:rgb_buffer
                                                     length:(u4_stride * u4_height * 3)
                                               freeWhenDone:YES];
[self function1:pu1_out_buffer
            rgb_buffer:(UWORD16 *)[rgbData bytes]
                        …]

    free(pu1_out_buffer); 
    UIImage *outUIImage  = [self function2:rgbData          
                                        width:u4_width
                                       height:u4_height
                                       stride:u4_stride];

    return outUIImage;
}
4

1 に答える 1

1

このコードにはいくつかの問題があります。

char *pu1_out_buffer = malloc(length);
pu1_out_buffer = datafromfile(FILE_PATH)  // initialized with some data , not important

それはオリジナルを漏らしmallocます。

[self function1:pu1_out_buffer
        rgb_buffer:(UWORD16 *)[rgbData bytes]
                    …]

そのメソッドは次のようなものでなければなりません: function1:rgbBuffer:...

墜落に関しては、Martin が挙げた理由による可能性が最も高い。ARC が有効になっている場合は、インスタンスから内部ポインターを取得しています。NSMutableDataARC は の戻り値を元のデータに関連付けることができずbytes、データ オブジェクトが使用されなくなったと見なして解放します。

修正するには、次を追加します。

[rgbData bytes]直前にreturn outUIImage;。これにより、通話中にオブジェクトが使用中であることが ARC に通知されfunction2:width:height:stride:ます。

于 2013-10-15T15:22:10.790 に答える