1

我有这个对象:

@interface Song : NSManagedObject

@property (nonatomic, strong) NSString *songName;
@property (nonatomic) int32_t achievedPoints;

当我这样设置属性时

Song *song1 = [[SongStore sharedStore] createSong]; 
song1.songName = @"Song 1";
song1.achievedPoints = 0;

一切正常,但是一旦我尝试将achievedPoints变量设置为 0 以外的值,我就会得到一个 EXC_BAD_ACCESS。

这就是该createSong方法的作用:

- (Song *)createSong {
    double order;
    if ([allSongs count] == 0) {
        order = 1.0;
    } else {
        order = [[allSongs lastObject] orderingValue] + 1.0;
    }

    Song *p = [NSEntityDescription insertNewObjectForEntityForName:@"Song" inManagedObjectContext:context];

    [p setOrderingValue:order];
    [allSongs addObject:p];
    return p;
}

我不知道为什么获取该值并将其设置为 0 有效,但除零以外的任何东西都会使程序崩溃。非常感谢任何帮助。

4

2 回答 2

4

这在我以前发生过一次。我不确切知道哪些设置搞砸了,但我认为,您的托管对象模型中有一个设置可以控制该类是否应该使用原始值(int、float 等)或对象值(NSNumber *等)来设置它的值。如果这搞砸了,并且您认为在实际设置对象时正在设置原语,则会发生以下情况:

//song1.achievedPoints = 0;
song1.achievedPoints = (NSNumber *)0x00000000; 
//This is OK because it is the same as nil

//song1.achievedPoints = 1;
song1.achievedPoints = (NSNumber *)0x00000001; //You can see why this is bad!

我的解决方案是通过Create NSManagedObject Subclass模板重新生成类,确保选中Use Scalar Values for Primitives 。

于 2013-02-21T13:00:24.353 回答
0

这个问题发生在我身上,因为实体没有正确链接到我的类文件。发生这种情况时,Core Data 会动态创建自己的子类,而不是使用我自己的,并且该子类的设置器需要装箱的原语。

您可以通过确保模型文件中实体的“类”属性设置为正确的类而不是默认的NSManagedObject.

实体配置

当你使用 XCode 的Create NSManagedObject Subclass模板时,XCode 会自动为模型文件中的对应实体设置这个值。这可能是解决 borrrden 问题的原因。但是,通过确保正确设置此值,您应该能够在不创建新文件的情况下获得相同的结果。

于 2016-05-03T21:44:17.350 回答