2012-07-09 2 views
3

lorsque j'essaie de définir la variable eventId de mon NSManagedObject (Event) J'obtiens l'erreur EXC_BAD_ACCESS. Je ne connais pas la raison.Données de base setPrimitive-setter provoque EXC_BAD_ACCESS

Voici le code de ma classe 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"]; 
} 

... 

Tout le monde peut résoudre le problème?

Merci pour l'aide

Répondre

4

Si vous regardez attentivement the documentation, vous verrez que les accesseurs primitives pour l'attribut double length scalaire dans l'exemple utilisent encore NSNumber * arguments et renvoient des valeurs:

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

[Note: J'ai ajouté le * qui manquait dans l'extrait de code d'origine dans la documentation d'Apple.]

Alors essayez de déclarer vos accesseurs primitifs wi th NSNumber * arguments et valeurs de retour.

Ou si vous devez vraiment, considérer implementing your own primitive accessor methods.

+0

vous avez raison ... Je nous ont à NSNumber *. La solution est à ma réponse –

0

Solution:

@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"]; 
} 
Questions connexes