Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 目标C:如何创建一个从int返回UInt8数组的方法_Objective C - Fatal编程技术网

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

Objective c 目标C:如何创建一个从int返回UInt8数组的方法,objective-c,Objective C,我需要创建一个Objective-C方法,将int转换为字节数组。在本例中,我不能将NSArray用作返回类型,它必须是UInt8数组。我已经编写了一个简单的方法来实现这一点,但它在编译过程中有错误,并告诉我有不兼容的返回类型。下面是代码片段。有什么想法吗 - (UInt8[])ConvertToBytes:(int) i { UInt8 *retVal[4]; retVal[0] = i >> 24; retVal[1] = i >>

我需要创建一个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;
}

无法返回本地C数组。您需要
malloc(sizeof(UInt8)*4)
,填充它,返回指针,当然,完成后不要忘记释放它

下面是一个如何编写和使用它的示例(只是为了强调释放分配的内存的重要性):


(您可能会注意到,我还将其更改为类方法。由于它不依赖于实例的任何属性,因此将其更改为类方法或函数更为合理。但这与数组和指针的工作方式无关-我只喜欢在示例中使用良好的编码样式。)

返回
结构中的值。不能从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]);
}


这不是对这个问题的回答,只是对一些不太正确的问题的评论:
UInt8*retVal[4]
指定一个包含四个指向UInt8值指针的数组,而
UInt8[]
指定一个UInt8值数组,其大小将在编译时确定。指针和它们指向的东西是完全不同的东西,你要非常小心,不要把它们混淆起来。我觉得问这个问题很愚蠢,但你能把整个解决方案都贴出来吗。我是Objective-C新手,来自Java背景,仍在学习方法的结构等@Adam:我用一个例子更新了。顺便说一下,
UInt8
s和C数组以及所有这些东西都来自C,而不是特定于Objective-C!非常感谢你的帮助。我现在明白你在描述什么了。这是有道理的。如果可以的话,这确实是一个更好的选择。结构是文明的数据结构;C数组会让你兴奋不已。不过,我认为有必要指出,这两者并不等同。结构不能保证与数组具有相同的布局。因此,如果您有一个需要UInt8数组的函数,那么传入一个指向具有四个UInt8成员的结构的指针无疑是未定义的行为。传入
&test.val[0]
应该仍然有效,不是吗?是的,当然可以。我应该更仔细地评论一下,对不起。我只知道人们对此感到非常困惑,因为这是一个非常noob级别的问题,我认为指出一个结构并不等同于它的成员是很重要的。

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