2012-04-08 19 views
12

Estoy tratando de determinar lo que es un valor en una matriz y luego implementar cambios en la matriz, pero no puedo acceder a la matriz en el primer lugar ...conversión de NSNumber a NSInteger

NSNumber *row = [NSNumber numberWithInt:recognizer.view.tag]; 
    NSInteger *newRow = [row integerValue]; 
    NSInteger *index = [selectedItems indexOfObject:row];//0=Not selected 1=selected; 
    NSLog(@"%@ & ",row); 
    if (index == 0) { 
     [selectedItems removeObjectAtIndex:newRow]; 
     [selectedItems insertObject:@"1" atIndex: newRow]; 
     [(UITableViewCell *)(recognizer.view) setAccessoryType:UITableViewCellAccessoryCheckmark]; 
    } else { 
     [selectedItems removeObjectAtIndex: newRow]; 
     [selectedItems insertObject:@"0" atIndex: newRow];; 
     [(UITableViewCell *)(recognizer.view) setAccessoryType:UITableViewCellAccessoryNone]; 
    } 

Como puede ver, trato de obtener información de la variable de fila, que es un NSNumber y encontrar el valor de la matriz con la variable de índice. También he declarado esto en mi onload() ...

selectedItems = [NSArray arrayWithObjects: 0, 0, 0, nil]; 

El problema es que tengo todas estas advertencias diciendo ...

Incompatible integer to pointer conversion initializing 'NSInteger *' (aka 'int *') with an expression of type 'NSUInteger' (aka 'unsigned int'); 

Cada vez que utilice la fila varaibles o newRow. Como puede ver, newRow es solo una fila como un entero. ¿Qué estoy haciendo mal?

Respuesta

42

NSInteger es simplemente un typedef para int por lo que no es un tipo de objeto, es un escalar, no tiene que declararlo como un tipo de puntero. Utilice

NSInteger newRow = [row integerValue]; 

en su lugar.

+1

+1. Solo quiero agregar que aunque NSInteger es solo un typedef para int, es más útil que solo un int porque se acomodará a las arquitecturas de 32 bits/64 bits por sí mismo. – jmstone617

+0

Si elimino el puntero para newRow e index, no recibo ninguna advertencia, pero cuando ejecuto mi aplicación aparece un error cuando ejecuto este código ... NSLog (@ "% @ &% @", newRow, index); El error es EXC_BAD_ACCESS –

+1

Es mejor considerarlo como un typedef para 'long' (incluso cuando no lo es). Su tamaño varía según la arquitectura de destino. –

2

NSInteger es una primitiva, no un tipo de objeto. Las colecciones, como las matrices, solo pueden contener objetos, como NSNumber.

Puede obtener el valor primitivo de un NSNumber utilizando métodos como -integerValue. Tenga en cuenta que normalmente no quiere hacer un puntero NSInteger (NSInteger *), solo quiere un NSInteger.

Tampoco tiene sentido tomar recognizer.view.tag, haciendo un NSNumber de eso, y luego llamando al -integerValue en ese NSNumber. Simplemente use recognizer.view.tag directamente como el valor entero. (Todavía puede asignarlo a una variable local para acceso rápido.)

+0

Todavía aparece un error, "EXC_BAD_ACCESS" –

+0

El especificador de formato "% @" en una llamada NSLog espera que su argumento sea un puntero de objeto. Para registrar un número entero, use "% d". –