Objective-C:如何创建一个从int返回UInt8数组的方法

时间:2010-03-15 22:39:24

标签: objective-c

我需要创建一个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 个答案:

答案 0 :(得分:11)

返回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]);
}

答案 1 :(得分:6)

您无法返回本地C数组。你需要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);
}

(您可能会注意到我也将其更改为类方法。由于它不依赖于实例的任何属性,因此它更有意义成为类方法甚至只是一个函数。但这与数组和指针的工作方式没有任何关系 - 我只想在示例中使用良好的编码风格。)