NSNumber 中的错误值,未定义 CFNumberType

Wrong value in NSNumber, CFNumberType not defined

全部,

我创建了一个包含 3 个字段的数据模型:
- 播放类型 int16
- 仓位类型 int16
- 播放类型 int16

我已经为它生成了一个class。
Tile.h

@property (nonatomic, retain) NSNumber * beingPlayed;
@property (nonatomic, retain) NSNumber * playedBy;
@property (nonatomic, retain) NSNumber * position;

Tile.m

@dynamic beingPlayed;
@dynamic playedBy;
@dynamic position;

我假设所有 3 个变量都是 NSNumbers 并且类型为 int16 (CFNumberType = kCFNumberSInt16Type)。

当我创建 Tile 对象时,我将所有参数设置为 0 [NSNumber numberwithint:0]

但是当我想为这个对象设置另一个值时,没有设置beingPlayed的类型,所以这个值不正确。

我用过:

self.beingPlayed = self.playedBy = self.position = [NSNumber numberWithInt:175];

结果:
位置 = 175
播放次数 = 175
正在播放 = -81

我用过:

self.playedBy = self.position = [NSNumber numberWithInt:175];
self.beingPlayed = self.position;

结果:
位置 = 175
播放次数 = 175
正在播放 = -81

当我调试时,我看到:
- 仓位类型为 kCFNumberSInt16Type
- playedBy 的类型为 kCFNumberSInt32Type
- beingPlayed 有 NO 类型....

这是怎么回事?在哪里可以设置类型或者类型在哪里设置?
我的问题是它现在是一个普通的 int,只能包含小于 127 的值,但我已将数据模型中的类型设置为 int16....

编辑:

来自评论的 OP 的附加代码:

Tile *newTile = [NSEntityDescription 
   insertNewObjectForEntityForName:@"Tile" inManagedObjectContext:context]; 
newTile.playedBy = @(129); 
newTile.position = @(129); 
newTile.beingPlayed = @(129); 
[context save:&error]; 

Logging: playedBy = -127, position = 129 and beingPlayed = 129

这是您需要了解的内容:生成的 NSManagedObject 子类对所有数字使用 objects 而不是 primitives。也可以使用基元,但保留 Xcode 编辑器创建它们的方式有一些优势。

简而言之,您需要了解 C 中的对象只是指向该对象的指针。所以这个指针的 value 与你无关。 SDK 提供了包装和解包 NSNumber 对象的明显方法。

// set
position = @3994;

// get
NSInteger p1 = position.integerValue;
int       p2 = position.intValue;
BOOL      p3 = position.boolValue;

// modify
position = @(position.integerValue + 1);  

// compare
position.integerValue == position2.integerVaue // true if equal

您的链式赋值不起作用,因为 = 在处理对象与值时的含义不同。

NSNumber *x, *y;
x = @1; // assign value to x
y = x;  // y points to x

此外,请确保您没有覆盖任何可能也会更改结果的 getter 或 setter。

"Also, make sure that you are not overriding any getters or setters that could potentially also change the result."

成功了!我有一个方法 (BOOL)isBeingPlayed,它也是 KVC 实现的一部分,因此是 setters/getters 之一……我忘记了。

并且因为 BOOL 在 basic 中也是 int,所以类型被转换为 int 而不是 int16....

谢谢大家的帮助!