核心数据setPrimitive-setter导致EXC_BAD_ACCESS

时间:2012-07-09 21:51:40

标签: ios core-data exc-bad-access

当我尝试设置eventId的变量NSManagedObject (Event)时,我得到了错误EXC_BAD_ACCESS。 我不知道原因。

以下是我的班级Event

的代码
@interface Event : NSManagedObject 

@property (assign)              NSInteger   eventId;

@end


@interface Event (PrimitiveAccessors)
- (NSInteger)primitiveEventId;
- (void)setPrimitiveEventId:(NSInteger)event_id;
@end



@implementation Event
@dynamic eventId;

...

-(NSInteger)eventId
{
    [self willAccessValueForKey:@"eventId"];
    NSInteger id = [self eventId];
    [self didAccessValueForKey:@"eventId"];
    return id;
}

-(void)setEventId:(NSInteger)event_id
{
    [self willChangeValueForKey:@"eventId"];
    [self setPrimitiveEventId:event_id]; //Here I get the error
    [self didChangeValueForKey:@"eventId"];
}

...

任何人都可以解决问题吗?

感谢您的帮助

2 个答案:

答案 0 :(得分:4)

如果仔细查看the documentation,您会看到示例中标量属性double length的原始访问器方法仍使用NSNumber *参数并返回值:

@interface MyManagedObject (PrimitiveAccessors)
@property (nonatomic, retain) NSNumber *primitiveLength;
@end

[注意:我在Apple的文档中添加了原始代码段中缺少的*。]

因此尝试使用NSNumber *参数声明原始访问器并返回值。

或者,如果你真的必须,请考虑implementing your own primitive accessor methods

答案 1 :(得分:0)

解决方案:

@interface Event (PrimitiveAccessors)
- (NSNumber *)primitiveEventId;
- (void)setPrimitiveEventId:(NSNumber*)event_id;
@end

-(NSInteger)eventId
{
    [self willAccessValueForKey:@"eventId"];
    NSNumber *id = [self primitiveEventId];
    [self didAccessValueForKey:@"eventId"];
    return [id integerValue];
}

-(void)setEventId:(NSInteger)event_id
{
    [self willChangeValueForKey:@"eventId"];
    [self setPrimitiveEventId:[NSNumber numberWithInteger:event_id]];
    [self didChangeValueForKey:@"eventId"];
}