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