1

我有一个NSDictionary包含 (key,value) 对 (byte, Custom Class) where byteis 的对象typedef unsigned char byte

以下是我的代码

Mos6502.h

@interface Mos6502 : NSObject {
@private
    Instruction *currentInstruction;
}

@property NSDictionary *instructions;

Mos6502.m,在init方法中,我用一个表示指令操作码的字节(无符号字符)填充字典,该值是指令类的一个实例。像下面这样

instructions = [NSDictionary dictionaryWithObjectsAndKeys:
                      0x00, [[BRK alloc] init],
                      // rest of the instructions
                      nil];

其中 BRK 和其他指令类继承自一个名为 Instruction 的基类。

在同一个文件中,但在我需要获取当前指令的方法中,以下行给了我错误:

currentInstruction = [instructions objectAtKey:[mem readByteAt:(PC++)]];

带有以下错误消息,

Implicit conversion of 'byte' (aka 'unsigned char') to 'id' is disallowed with ARC

当我尝试输入而不是[mem readByteAt:(PC++)]数字时,0x00我不再收到错误消息。

为什么我会收到此错误?

4

4 回答 4

2

你的问题是:

  • 0x00 不是 NSObject,您只能将 NSObjects 放入字典中。您可以通过将 @ 放在它前面来“装箱”一个原语(制作成 NSNumber 等效项)。试试@0x00。

  • 我认为您拥有错误的密钥和价值。与世界其他地方不同,Apple 在 dictionaryWithObjectsAndKeys 方法中将 Object 放在 Key 之前。

于 2013-11-14T20:53:30.243 回答
1

您可以将 char 存储在NSNumber然后存储中,但集合类中的值必须是 Obj-C 值。

还有……关键必须支持NSCopying.

instructions = @{@(0x00) : [[BRK alloc] init] };

或者

  instructions = [NSDictionary dictionaryWithObjectsAndKeys:
                  [NSNumber numberWithChar:0x00], [[BRK alloc] init],
                  // rest of the instructions
                  nil];
于 2013-11-14T20:52:28.210 回答
1

您不能使用字节作为 NSDictionary 中的键。你必须使用一个对象。尝试:

instructions = @{@0 : [BRK new]};

(这是使用比使用 dictionaryWithObjectsAndKeys 更容易的新对象原语)

于 2013-11-14T20:53:43.330 回答
1

typedef unsigned char byte不构成byte“类”。byteakachar只是一个普通的 C 类型,而不是对象或对象类型;因此编译器错误。

您要么必须按照其他人的建议将值装箱NSNumber(或某些自定义类),要么使用NSMapTable作为字典,它可以将任意指针存储为键和值(不仅限于objective-c 对象NSDictionary)。

于 2013-11-14T20:57:53.727 回答