Ios NSMangeObject不允许访问对象数据

Ios NSMangeObject不允许访问对象数据,ios,objective-c,core-data,nsmanagedobject,Ios,Objective C,Core Data,Nsmanagedobject,我正在使用CoreData,我有一个类型为Thing的NSManagedObject。当我设置一个断点时,我可以控制台“poathing”,它显示存储的数据 { thingID = 5181c56063ab02c4d1000016; distance = "2.075121"; lat = "37.815834"; lng = "-122.406417"; } 但是,如果我尝试访问lat或lng(这是核心数据的两倍)。我得到了“楠”的回复。 如果我尝试“poat

我正在使用CoreData,我有一个类型为Thing的NSManagedObject。当我设置一个断点时,我可以控制台“poathing”,它显示存储的数据

{
    thingID = 5181c56063ab02c4d1000016;
    distance = "2.075121";
    lat = "37.815834";
    lng = "-122.406417";
}
但是,如果我尝试访问lat或lng(这是核心数据的两倍)。我得到了“楠”的回复。 如果我尝试“poathing.lat”,控制台会显示nan

如果我尝试“poathing.thingID”,控制台显示5181C56063AB02C4D100016

如果我尝试像newThing.lat=aThing.lat那样赋值,则newThing.lat变为nan

我猜这和数据有关,是双倍的吗

更新:

下面是我的.h是如何拥有属性的

@property (nonatomic) double lat;
@property (nonatomic) double lng;
下面是我是如何使用它们的

coordinate.latitude = thing.lat;
coordinate.longitude = thing.lng;
下面是我如何改变它们的

@property (nonatomic) double *lat;
@property (nonatomic) double *lng;
我现在是如何使用它们的,而且似乎很有效

coordinate.latitude = *(thing.lat);
coordinate.longitude = *(thing.lng);

如上所述,从“double”切换到“NSNumber”,并将double转换为NSNumber,如
[NSNumber numberWithDouble:someDouble]

或者。。。。另一种(可能是更好的)方法(如中所示)是,您可以将“lat”保持为double,但在后台,您可以制作自己的getter/setter,并将double转换为NSNumber

some.h
@property long lat;

some.m
@interface MyManagedObject (PrimitiveAccessors)
@property (nonatomic) NSNumber primitiveLat;
@end


- (long)lat {

    [self willAccessValueForKey:@"lat"];
    NSNumber *tmpValue = [self primitiveLat];
    [self didAccessValueForKey:@"lat"];
    return (tmpValue!=nil) ? [tmpValue longValue] : 0.0; // Or a suitable representation for nil.
}

- (void)setLat:(long)value {

    NSNumber *temp = @(value);
    [self willChangeValueForKey:@"lat"];
    [self setPrimitiveLat:temp];
    [self didChangeValueForKey:@"lat"];
}

核心数据不将数字存储为整数或双精度等。它们存储在
NSNumber
对象中。无论哪种方式,它都应该打印出值,而不是将其返回为
nan
,但您可以尝试使用
po[aThing.lat doubleValue]
。实际上,这不是真的。核心数据可以对基本数据类型使用标量属性。在生成一个类时,有一个选项就是“对基本数据类型使用标量属性”。实际上,这只影响子类的生成方式,而不影响核心数据存储数据的方式。核心数据存储数据的方式是一个实现细节。它为setter和getter提供了默认实现。NSManagedObject子类的最终用户实际上不必关心,他们也不应该关心核心数据在幕后是如何工作的。对于最终用户,他们可以使用核心数据提供的访问器设置和获取标量属性。这里需要注意的重要一点是,围绕标量的访问器处理的是标量,而不是像NSNumber这样的包装器。例如,我的lat是39.34343。。。使用上面的代码7.87634…啊,derp。你需要使用long。如果long不起作用,用long替换long
-(长-长)lat
-(无效)setLat:(长-长)值
[tmpValue longLongValue]
长-长lat
。。。免责声明:这是未经测试,这就是为什么我不确定你是否需要长或“长”。