Vamos a empezar por los tipos de datos NSInteger e int. ambos representan un dato de tipo entero y son tipos primitivos por lo que no es necesario reservar memoria dinámicamente e inicializarlos mediante el método init antes de empezar a usarlos. simplemente se declaran y si se quiere se les asigna un valor.
En concreto el tipo int es para arquitectura de 32 bits y se ha heredado del lenguaje C, por el contrario NSInteger es de objective-C y puede tener un tamaño u otro siendo esa su principal diferencia por lo que en nuestro caso para el desarrollo de apps para Iphone/Ipod/Ipad nos resulta ajeno y podemos usar cualquiera de los dos.
En cambio el tipo de dato NSNumber es un objeto que almacena un dato numérico ya sea entero/real/double... y por ello es necesario usar punteros ya que pertenece a objective-c sí hay que reservar memoria dinámicamente y a continuación inicializarlos, ya hemos visto en otros post que lo podemos inicializar a un valor concreto y sino la inicialización por defecto se realiza llamando al método init (con este método el objeto apunta a c)
int myEntero = 4;
NSInteger miEntero_2 = 5;
NSNumber *miObjetoNumerico = [[NSNumber alloc] initWithInt:40]; // En este caso lo inicializamos con un valor de tipo entero en concreto el 40
sino la inicialización por defecto sería:
NSNumber *miObjetoNumerico = [[NSNumber alloc] init];
Sobre las dudas de "por ello es necesario usar punteros ya que pertenece a objective-c" fue un despiste, ya que es habitual el uso de punteros en objetive C.
¡Gracias a los que nos avisaron del error!