此转换有效吗?

时间:2014-08-19 18:08:20

标签: objective-c arrays object code-conversion

我使用Java中的代码,其中p1是Pixel类的对象,它访问数组像素并在适当的索引处为其赋值(在右侧)。 R G和B是一些int值。

p1.pixels[index] = 0xff000000 | (R << 16) | (G << 8 ) | B;

我在目标C中转换此代码的方法如下。但我不知道是否必须提及对象名称(在p1.pixels处插入对象)或在像素处插入对象是否相同?

int newNumber = 0xff000000 | (R << 16) | (G << 8 ) | B;

NSNumber *yourNumber = [NSNumber numberWithInt:newNumber];
[pixels insertObject:yourNumber atIndex:index];

2 个答案:

答案 0 :(得分:2)

NSArrays没有Java阵列那样的硬件大小限制。它们从前面填充,没有默认值(Java中为null),并且不允许您插入到任意位置。

的唯一方法
[pixels insertObject:yourNumber atIndex:index];
如果数组中已存在大于或等于yourNumber个元素,

行是安全的。

如果您确实需要该对象存在于某个索引处,您应该使用其他像素值填充较早的位置,或者使用[NSNull null]

等占位符对象填充

此外,int在不同的Mac和iOS设备上有不同的尺寸。如果你想要一个特定大小的整数,你应该使用像uint32这样的类型之一,在每台机器上都保证是32位。

答案 1 :(得分:0)

我认为如果你正在操纵这样的像素,你最好(在性能和记忆方面)坚持使用普通的C语言。

如果您想从像素数据创建UIImage对象,那么您将使用使用malloc()分配的缓冲区;例如(代码取自here - 请参阅其余代码的问题):

char* rgba = (char*)malloc(width*height*4);
for(int i=0; i < width*height; ++i) {
    rgba[4*i] = buffer[3*i];
    rgba[4*i+1] = buffer[3*i+1];
    rgba[4*i+2] = buffer[3*i+2];
    rgba[4*i+3] = 255;
}

请注意,这是一个字节缓冲区,而不是uint32_t缓冲区,因此请相应调整。

使用填充了NSArray个对象的NSNumber会慢很多,占用更多空间。