将Integer设置为零以外的任何值时的EXC_BAD_ACCESS

时间:2013-02-21 11:56:08

标签: iphone ios objective-c core-data exc-bad-access

我有这个对象:

@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可以工作,但除零之外的任何事情都会使程序崩溃。任何帮助都非常感谢。

2 个答案:

答案 0 :(得分: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!

我的解决方案是通过创建NSManagedObject子类模板重新生成类,确保选中使用基元的标量值

答案 1 :(得分:0)

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

您可以通过确保模型文件中实体的“Class”属性设置为正确的类而不是默认的NSManagedObject来解决此问题。

Entity Configuration

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