2010-01-01 30 views
7

Tengo un nivel de clase int definido en mi archivo de encabezado. En el archivo .m, tengo un método que me gustaría tomar un parámetro int, modificarlo y tener el valor modificado reflejado en la persona que llama. Por ejemplo:Pasando número entero por referencia

classLevelInt = 2; 
[self someMethod:classLevelInt]; 

//Here, I'd like classLevelInt to equal the value assigned to it in the method 

En -someMethod:

- (void)someMethod:(int)anInt{ 
//do some stuff 
if(somecondition){ 
    anInt = 2 + 3; //some operation 
} 
} 

He intentado usar un

  • NSNumber
  • Puntero de un puntero (**)
  • conversión de int a NSNumber dentro del método, lo que da como resultado un nuevo espacio de direcciones

pero nunca vea el valor establecido dentro del método para classLevelInt reflejado fuera de ese método. Sin devolver el nuevo valor int de -someMethod, ¿cómo puedo mantener el valor de classLevelInt fuera del método? O, si eso simplemente no es un buen enfoque, ¿cuál es la mejor manera?

Respuesta

14

Puede pasar un puntero a classLevelInt como int*.

classLevelInt = 2; 
[self someMethod:&classLevelInt]; 

- (void)someMethod:(int*)anInt { 
    //do some stuff 
    if(somecondition){ 
    *anInt = 2 + 3; //some operation 
    } 
} 

Una segunda manera, se puede cambiar directamente classLevelInt en la misma clase.

- (void)someMethod { 
    //do some stuff 
    if(somecondition){ 
    classLevelInt = 2 + 3; //some operation 
    } 
} 
+0

Simplemente iba a responder lo mismo. ¡gran respuesta! –

+0

Requiere desreferencia del puntero. ¿Cómo se usa la sintaxis como (int &) anInt? – jjxtra

8

iamamac es correcta, pero también se preguntó si hay una mejor manera.

Si es posible, simplemente devuelva el valor directamente. Pass-by-reference generalmente causa un poco de "olor a código" del tipo desagradable.

Si necesita devolver varias entradas, tal vez debería crear una estructura o una clase para encapsular los datos.