2012-03-19 16 views
13

Estoy tratando de inicializar NSDictionary pero me da error siguiente:¿El NSDictionary initWithObjectsAndKeys trata los objetos NULL/Nil y que no sean objetos NSString

Program received signal: “EXC_BAD_ACCESS”. 

Aquí está mi código problemático [Quiz.m]:

@implementation Quiz 

@synthesize question; 
@synthesize correctAnswer; 
@synthesize userAnswer; 
@synthesize questionId; 

-(NSString*) getAsJsonString 
{ 
    // Following line gives the error 
    NSDictionary *qDictionary=[[NSDictionary alloc] initWithObjectsAndKeys:question,@"questionText",questionId,@"questionId",userAnswer,@"userAnswer",correctAnswer,@"correctAnswer",nil]; 

    .............. 
    ......... 
    ............ 
    return jsonString; 
} 
@end 

Y aquí es Quiz.h archivo para referencia

@interface Quiz : NSObject { 

@public 
    NSString * question; 
    BOOL correctAnswer; 
    BOOL userAnswer; 
    NSInteger questionId; 
} 

@property (nonatomic,retain) NSString * question; 
@property (nonatomic, assign) NSInteger questionId; 
@property (nonatomic,assign) BOOL correctAnswer; 
@property (nonatomic,assign) BOOL userAnswer; 

- (NSString*) getAsJsonString; 
@end 

¿Cómo debo solucionarlo, por favor ayúdame, soy nuevo en el objetivo c y me está volviendo loco. ¿NSDictionary initWithObjectsAndKeys maneja objetos que no sean cadenas y objetos nulos?

Respuesta

39

NSDictionary no se pueden almacenar valores escalares (como BOOL, NSInteger, etc.), puede almacenar solo objetos. Debe envolver sus valores escalares en NSNumber para almacenarlos:

NSDictionary *qDictionary = [[NSDictionary alloc] 
    initWithObjectsAndKeys:question,@"questionText", 
          [NSNumber numberWithInteger:questionId],@"questionId", 
          [NSNumber numberWithBool:userAnswer],@"userAnswer", 
          [NSNumber numberWithBool:correctAnswer],@"correctAnswer", 
          nil]; 
+0

Gracias esto resolvió mi problema. +1 –

+0

Pero ahora enfrento otro problema, cuando lo hago: 'userAnswer = [NSNull null]' siempre tiene valor SÍ? ¿Cómo puedo inicializar Bool con valor nulo? –

+1

Acepte la respuesta si fue de ayuda. Las variables booleanas no pueden ser 'NULL', son' YES' (distinto de cero) o 'NO' (' 0 = NULL == NO'). Tiene 'userAnswer = [NSNull null] == YES', ya que' [NSNull null] 'es un objeto, y establece' userAnswer' con el puntero a este objeto, y el puntero en sí no es cero, por lo que es 'SÍ' . No confundas objetos con valores escalares. –

Cuestiones relacionadas