2012-12-20 4 views
1

정수를 바이트 배열 (iPhone 용)로 변환하는 기능이 있습니다. 역 동성을 추가하기 위해 malloc을 사용하여 배열을 할당했습니다. 그러나 이것은 기억이 누출 될 것이라고 생각합니다. 무엇 메모리는,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]; 

내가 모르는 이후 전화 무료 (바이트), 호출 기능을 피하려고,이 메모리를 관리하는 가장 좋은 방법으로 또는 명시 적으로 알고 할당되지 않았고 해제되지 않았습니다. 당신은 당신이 무료 통화를 피하기 위해 원하기 때문에 (메소드 또는 클래스의 dealloc의 말 중)


, 당신이 당신의 바이트 [포장 할 수있는 바이트 완료되면

+0

출시를 :

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

나는 또한 바이트를 보유하는있는 NSData을 만드는 것이 좋습니다 것입니다 여전히 바이트 버퍼를 변경 허용하면서, 이것은 당신을 위해 메모리 관리 돌볼 것 끝에는 free()가 붙어 있습니까? –

+0

이 접근법의 문제점은 함수 호출자가 구현이나 주석을 보지 않고 반환 된 포인터를 해제할지 여부를 알 수 없다는 것입니다. 그것이 OP가 대안을 요구하는 이유 일 것입니다. – nhahtdh

+0

NSData를 사용하여 바이트를 랩핑하십시오. –

답변

3

몇 가지 :

  1. char 유형 (및 signed charunsigned char)은 모두 정의에 따라 1 크기이므로 sizeof(unsigned char)은 필요하지 않습니다.

  2. 그것은 당신이 다만이 경우는 단순히 int의 주소를 가지고 가고에 캐스팅, 그것은 더 많은 공간을 할당 할 필요가 없습니다, int 객체의 바이트 표현을 싶어처럼 보이는

    unsigned char *에 대한 포인터. 바이트 순서가 잘못되었을 경우 NSSwapInt 함수를 사용하여 int의 바이트 순서를 바꾼 다음 주소를 가져와 unsigned char *으로 캐스트 할 수 있습니다. 예를 들어 :

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

    이 캐스트는 법적 sizeof(int) 바이트를 읽을 때까지 bytes에서 읽는 것은 최대 법률이다. 이것은 “ 객체 표현 ”에 액세스하고 있습니다.

  3. 당신이 그때 당신은 단순히 당신이 완료되면 같이 free에 버퍼를 전달해야, malloc를 사용하여 주장하는 경우 :

    free(bytes); 
    
  4. 하지 올바른을 의미 않는 방법의 이름을 반환 된 버퍼의 소유권. 메서드가 호출자가 해제 할 책임이있는 것을 반환하면 new, copy 또는 때때로 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. 당신은 포장 수를 A NSData 예에 bytes :

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

    하는 당신의 방법을 확인하십시오 일반적인 객체 소유권 규칙을 따릅니다.

+0

감사합니다. iOS는 long/int 수의 첫 번째 바이트에 LSB를 저장하기 때문에이 함수가 필요했습니다. data = [NSData dataWithBytes : & l length : 8]; 필요한 바이트 순서를 잘못 반환합니다. 그러나 NSSwapInt/Long 함수를 알지 못했습니다. 팁 주셔서 감사. 그게 내 문제를 해결할거야. 그렇다면 int/long을 바이트로 변환하는 함수를 작성할 필요가 없습니다. – karim

3

그냥 free(bytes); 전화 ]는있는 NSData 객체 :

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

1

일반적인 처리 방법은 호출자가 할당 된 바이트 버퍼를 전달하는 것입니다. 그 방법은 호출자가 그것을 무료로 책임이 있습니다. 뭔가 같이 :

+ (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]; 
} 
관련 문제