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类型 (and signed charand 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 回答