Цель-C: Как создать метод, который будет возвращать массив UInt8 из int - PullRequest
4 голосов
/ 16 марта 2010

Мне нужно создать метод Objective-C, который преобразует int в байтовый массив.В этом случае я не могу использовать NSArray в качестве возвращаемого типа, это должен быть массив UInt8.Я написал простой метод для этого, но он имеет ошибки во время компиляции и говорит мне, что у меня есть несовместимые типы возвращаемых данных.Вот фрагмент кода.Есть идеи?

 - (UInt8[])ConvertToBytes:(int) i 
{

     UInt8 *retVal[4];

     retVal[0] = i >> 24;
     retVal[1] = i >> 16;
     retVal[2] = i >> 8;
     retVal[3] = i >> 0;

     return retVal;
}

Ответы [ 2 ]

11 голосов
/ 16 марта 2010

Возвращает значение в struct. Вы не можете возвращать массивы в стиле C из функций C, а это также означает, что вы также не можете вернуть их из методов Objective-C. Однако вы можете вернуть структуру, и структурам разрешены массивы в качестве членов.


// in a header
typedef struct
{
    UInt8 val[4];
} FourBytes;


// in source
- (FourBytes) convertToBytes:(int) i
{
     FourBytes result = { i >> 24, i >> 16, i >> 8, i };
     return result;
}



- (void) someMethod
{
    FourBytes test = [someObject convertToBytes:0x12345678];
    NSLog ("%d, %d, %d, %d", test.val[0], test.val[1], test.val[2], test.val[3]);
}

6 голосов
/ 16 марта 2010

Вы не можете вернуть локальный массив Си. Вам нужно malloc(sizeof(UInt8) * 4), заполнить его, вернуть указатель и, конечно, не забудьте освободить его, когда закончите.

Вот пример того, как это будет написано и использовано (просто чтобы подчеркнуть важность освобождения памяти, которую вы выделяете):

+ (UInt8 *)convertToBytes:(int)i {
    UInt8 *retVal = malloc(sizeof(UInt8) * 4);
    retVal[0] = i >> 24;
    retVal[1] = i >> 16;
    retVal[2] = i >> 8;
    retVal[3] = i >> 0;
    return retVal;
}

- (void)someMethodUsingTheOtherOne {
    int something = 900;
    UInt8 *bytesOfInt = [[self class] convertToBytes:something];
    someFunctionUsingTheBytes(bytesOFInt);
    free(bytesOfInt);
}

(Вы, вероятно, заметите, что я также изменил его на метод класса. Поскольку он не зависит от каких-либо атрибутов экземпляра, имеет смысл использовать его как метод класса или даже просто функцию. Но это не имеет никакого отношения к тому, как работают массивы и указатели - мне просто нравится использовать хороший стиль кодирования в примерах.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...