Chiamata di funzione per riferimento in Objective-C

Il call by referenceIl metodo per passare argomenti a una funzione copia l'indirizzo di un argomento nel parametro formale. All'interno della funzione, l'indirizzo viene utilizzato per accedere all'argomento effettivo utilizzato nella chiamata. Ciò significa che le modifiche apportate al parametro influiscono sull'argomento passato.

Per passare il valore per riferimento, i puntatori agli argomenti vengono passati alle funzioni proprio come qualsiasi altro valore. Di conseguenza, è necessario dichiarare i parametri della funzione come tipi di puntatore come nella funzione seguenteswap(), che scambia i valori delle due variabili intere puntate dai suoi argomenti.

/* 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;
}

Per controllare maggiori dettagli su Objective-C - Pointers, puoi controllare il capitolo Objective-C - Pointers .

Per ora, chiamiamo la funzione swap() passando i valori per riferimento come nell'esempio seguente:

#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;
}

Compiliamolo ed eseguiamolo, produrrà il seguente risultato:

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

Il che mostra che la modifica si è riflessa anche all'esterno della funzione, a differenza della chiamata per valore in cui le modifiche non si riflettono all'esterno della funzione.