2011-04-18 8 views
26

Estoy trabajando en una aplicación en la que los datos se llenan desde una base de datos sqlite. Todo lo relacionado con la base de datos se hace en la clase appdelegate. He usado NSMutable matriz para contener objetos. He usado una clase NSObject por separado para las propiedades.NSInteger, NSNumber "propiedad" x 'con' retención 'atributo debe ser del tipo de objeto "

Me aparece el error: property 'x' with 'retain' attribute must be of object type.

código Mi appdelegate.m de archivo es como: Código

NSString *amovieName = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 0)]; 
NSInteger amovieId = sqlite3_column_int(compiledStatement, 1); 
//problem is here the 
//value of movieId is coming from database. 
//But error: "must be of object type" is puzzling me. 
//I am assuming to use NSNumber here. 

de mi archivo NSObject es como:

en .h Archivo-

NSInteger movieId; 

su propiedad como:

@property (nonatomic, retain) NSInteger movieId; 

y en .m Archivo-

@synthesize movieId; 

continuación, acabo de inicializar como:

-(id)initWithmovieName:(NSString *)mN movieId:(NSInteger)mId 
{  
    self.movieName=mN; 
    self.movieId=mId; 
    return self; 
} 

he encontrado otra manera que: valor de la asignación de un tipo de objeto .then casta NSNumber en NSInteger.for ex ;

NSNumber aNSNumbermovieID = sqlite3_column_int(compiledStatement, 1); 
      NSInteger amovieId = [aNSNumbermovieID integerValue]; 

pero sigo recibiendo los mismos errores (la propiedad 'x' con el atributo 'retener' debe ser del tipo de objeto).

¿Alguna sugerencia?

Respuesta

92

NSInteger es un escalar y no es un objeto. Entonces no deberías retenerlo, debería ser asignado. Cambiar su propiedad borrará el mensaje de advertencia. No es necesario hacer las cosas NSNumber que agregó en el.

@property (nonatomic, assign) NSInteger movieId; 

Es un poco confuso ya que NSInteger suena como una clase, pero es sólo un typedef para int. Apple lo introdujo como parte del soporte de 64 bits para que puedan escribirlo en el entero del tamaño adecuado para el procesador para el que se está compilando el código.

+1

muchas gracias, gracias – Alok

7

Creo que el error se debe a @propertyretain para NSInteger. Assign es para valores primitivos como BOOL, NSInteger o double. Para objetos use retain o copy, dependiendo de si desea mantener una referencia al objeto original o hacer una copia del mismo.

Aquí NSInteger claramente no es un objeto lo que debe tratar assign en lugar de retener

+0

hizo el truco!. – Alok

8

sólo tiene que utilizar NSNumber y que puede hacer:

@property (nonatomic, retain) NSNumber *movieId; 
Cuestiones relacionadas