1

整数をバイト配列に変換する機能があります(iPhone用)。動的性を追加するために、malloc を使用して配列を割り当てました。しかし、これはメモリリークになると思います。このメモリを管理する最善の方法は何ですか?

+ (unsigned char *) intToByteArray:(int)num{
    unsigned char * arr = (unsigned char *) 
                          malloc(sizeof(num) * sizeof(unsigned char));
    for (int i = sizeof(num) - 1 ; i >= 0; i --) {
        arr[i] = num & 0xFF;
        num = num >> 8;
    }
    return arr;
}

お電話の際は、

int x = 500;
unsigned char * bytes = [Util intToByteArray:x];

free(bytes) の呼び出しを避けたいのは、呼び出し元の関数が知らないか、明示的に知っているため、メモリが割り当てられ、解放されていないためです。

4

3 に答える 3

3

バイトを使い終わったら呼び出すだけfree(bytes);です(メソッドの最後またはクラスのdeallocで)


フリーコールを回避したいので、 byte[] を NSData オブジェクトでラップできます。

NSData *d = [NSData dataWithBytesNoCopy:bytes length:num freeWhenDone:YES];

于 2012-12-20T10:33:09.967 に答える
3

いくつかのこと:

  1. char型 ( andsigned charおよびunsigned char) はすべて、定義によりサイズが 1 であるため、不要sizeof(unsigned char)です。

  2. オブジェクトのバイト表現を取得したいだけのように見えますint。この場合は、より多くのスペースを割り当てる必要はありません。単に のアドレスを取得し、intへのポインタにキャストしますunsigned char *。バイト順が間違っている場合は、NSSwapInt関数を使用して のバイト順を入れ替えてからint、アドレスを取得して にキャストできunsigned char *ます。例えば:

    int someInt = 0x12345678;
    unsigned char *bytes = (unsigned char *) &someInt;
    

    このキャストは有効であり、バイトが読み取らbytesれるまでは読み取りが有効です。sizeof(int)これは「オブジェクト表現」にアクセスしています。

  3. の使用を主張する場合は、次のように、完了時にmallocバッファを渡すだけで済みます。free

    free(bytes);
    
  4. メソッドの名前は、返されたバッファの正しい所有権を意味するものではありません。メソッドが呼び出し元が解放する責任があるものを返す場合、 、newcopy場合によっては を使用してメソッドに名前を付けるのが慣例createです。より適切な名前は、copyBytesFromInt:または似たようなものです。それ以外の場合は、メソッドに事前に割り当てられたバッファーを受け入れさせ、メソッドを呼び出すことができますgetBytes:fromInt:。次に例を示します。

    + (void) getBytes:(unsigned char *) bytes fromInt:(int) num
    {
        for (int i = sizeof(num) - 1 ; i >= 0; i --) {
            bytes[i] = num & 0xFF;
            num = num >> 8;
        }
    }
    
  5. bytesインスタンスにラップできNSDataます:

    NSData *data = [NSData dataWithBytesNoCopy:bytes length:sizeof(num) freeWhenDone:YES];
    

    メソッドが通常のオブジェクト所有規則に従っていることを確認してください。

于 2012-12-20T10:41:13.787 に答える
1

これを処理する従来の方法は、呼び出し元が割り当てられたバイト バッファーを渡すことです。そうすれば、呼び出し元がそれを解放する責任があります。何かのようなもの:

int x = 500;
char *buffer = malloc(x * sizeof(char));
[Util int:x toByteArray:buffer];
…
free(buffer);

また、バイトを保持するために NSData を作成することも検討します。これにより、メモリ管理が行われますが、バイトバッファーを変更することもできます。

+ (NSData *) intToByteArray:(int)num {
    unsigned char * arr = (unsigned char *) 
                          malloc(sizeof(num) * sizeof(unsigned char));
    for (int i = sizeof(num) - 1 ; i >= 0; i --) {
        arr[i] = num & 0xFF;
        num = num >> 8;
    }

    return [NSData dataWithBytesNoCopy:arr length:num freeWhenDone:YES];
}
于 2012-12-20T10:43:22.977 に答える