所有
我创建了一个包含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]
但是当我想为这个对象设置另一个值时,未设置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
答案 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 ....
谢谢大家的帮助!