【问题标题】:Is this conversion valid?这种转换有效吗?
【发布时间】:2014-08-19 18:08:20
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 很难说没有更多的上下文。
  • 位混搭似乎是等效的,尽管使用特定长度的 int 类型会给人一种更温暖的感觉。使用数组,您需要遵守 Jeff 声明的警告。
  • 您可以使用 NSNumber 文字语法。将[NSNumber numberWithInt:newNumber] 替换为@(newNumber)

标签: objective-c arrays object code-conversion


【解决方案1】:

NSArray 没有像 Java 数组那样的硬大小限制。它们从前面填充,没有默认值(Java 中为 null),并且不允许您插入到任意位置。唯一的办法就是

[pixels insertObject:yourNumber atIndex:index];

如果数组中已有大于或等于yourNumber 的元素,则行是安全的。

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

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

【讨论】:

    【解决方案2】:

    我认为,如果您要像这样操作像素,最好(在性能和内存方面)坚持使用普通的旧 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 缓冲区,因此请进行相应调整。

    使用填充有NSNumber 对象的NSArray 会慢得多并且占用更多空间。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-20
      • 1970-01-01
      • 1970-01-01
      • 2011-01-24
      • 1970-01-01
      • 2016-07-12
      相关资源
      最近更新 更多