Llamada a función por referencia en Objective-C

los call by referenceEl método de pasar argumentos a una función copia la dirección de un argumento en el parámetro formal. Dentro de la función, la dirección se usa para acceder al argumento real usado en la llamada. Esto significa que los cambios realizados en el parámetro afectan el argumento pasado.

Para pasar el valor por referencia, los punteros de argumento se pasan a las funciones como cualquier otro valor. Entonces, en consecuencia, debe declarar los parámetros de la función como tipos de puntero como en la siguiente funciónswap(), que intercambia los valores de las dos variables enteras apuntadas por sus argumentos.

/* function definition to swap the values */
- (void)swap:(int *)num1 andNum2:(int *)num2 {
   int temp;

   temp = *num1;  /* save the value of num1 */
   *num1 = *num2; /* put num2 into num1 */
   *num2 = temp;  /* put temp into num2 */
  
   return;
}

Para consultar más detalles sobre Objective-C - Punteros, puede consultar el capítulo Objective-C - Punteros .

Por ahora, llamemos a la función swap() pasando valores por referencia como en el siguiente ejemplo:

#import <Foundation/Foundation.h>

@interface SampleClass:NSObject
/* method declaration */
- (void)swap:(int *)num1 andNum2:(int *)num2;
@end

@implementation SampleClass

- (void)swap:(int *)num1 andNum2:(int *)num2 {
   int temp;

   temp = *num1;     /* save the value of num1 */
   *num1 = *num2;    /* put num2 into num1 */
   *num2 = temp;     /* put temp into num2 */
  
   return;
   
}

@end

int main () {
   
   /* local variable definition */
   int a = 100;
   int b = 200;
   
   SampleClass *sampleClass = [[SampleClass alloc]init];

   NSLog(@"Before swap, value of a : %d\n", a );
   NSLog(@"Before swap, value of b : %d\n", b );
 
   /* calling a function to swap the values */
   [sampleClass swap:&a andNum2:&b];
 
   NSLog(@"After swap, value of a : %d\n", a );
   NSLog(@"After swap, value of b : %d\n", b );
 
   return 0;
}

Compilemos y ejecutemos, producirá el siguiente resultado:

2013-09-09 12:27:17.716 demo[6721] Before swap, value of a : 100
2013-09-09 12:27:17.716 demo[6721] Before swap, value of b : 200
2013-09-09 12:27:17.716 demo[6721] After swap, value of a : 200
2013-09-09 12:27:17.716 demo[6721] After swap, value of b : 100

Lo que muestra que el cambio también se ha reflejado fuera de la función, a diferencia de la llamada por valor, donde los cambios no se reflejan fuera de la función.