NSNumber中的值错误,CFNumberType未定义

时间:2015-05-01 06:04:18

标签: objective-c core-data int nsnumber

所有

我创建了一个包含3个字段的数据模型:
- beingPlayed类型int16
- 职位类型int16
- playingBy类型int16

我为它制作了一个班级 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对象时,我使用[NSNumber numberwithint:0]

将所有参数设置为0

但是当我想为这个对象设置另一个值时,未设置beingPlayed的类型,因此该值不正确。

我用过:

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

结果:
position = 175
playingBy = 175
arePlayed = -81

我用过:

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

结果:
position = 175
playingBy = 175
arePlayed = -81

当我调试时,我看到:
- position的类型为kCFNumberSInt16Type
- playingBy具有类型kCFNumberSInt32Type
- beingPlayed有 NO 类型....

这里发生了什么?我在哪里可以设置类型或类型集在哪里?
我的问题是它现在是一个普通的int,它只能包含值< 127,但我已将datamodel中的类型设置为int16 ....

编辑:

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

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

记录:playingBy = -127,position = 129 and beingPlayed = 129

2 个答案:

答案 0 :(得分:1)

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

简而言之,您需要了解C中的对象只是指向此对象的指针。所以此指针的与您无关。 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。

答案 1 :(得分:0)

  

“此外,请确保您没有覆盖任何吸气剂或二传手   这可能也会改变结果。“

做了伎俩!我有一个方法(BOOL)isBeingPlayed,它也是KVC实现的一部分,因此其中一个setter / getters ......它让我感到不安。

因为BOOL也是基本的int,所以类型转换为int而不是int16 ....

谢谢大家的帮助!