Objective-C通過參照呼叫函式

2019-10-16 23:15:11

將引數傳遞給函式的參照呼叫方法是將引數的地址複製到形式引數中。 在函式內部,該地址用於存取呼叫中使用的實際引數。 這意味著對引數所做的更改會影響傳遞引數的值。

要通過參照傳遞值,引數指標將像任何其他值一樣傳遞給函式。 因此,需要將函式引數宣告為指標型別,如以下函式swap()中所示,該函式swap()的引數指向兩個整數變數的值。

/* 定義一個用來交換兩個引數值的函式 */
- (void)swap:(int *)num1 andNum2:(int *)num2 {
   int temp;

   temp = *num1;  /* 儲存 num1 的值到 temp  */
   *num1 = *num2; /* 將 num2 的值分配給 num1 */
   *num2 = temp;  /* 將 temp 的值分配給 num2 */

   return;
}

要檢視有關Objective-指標的更多詳細資訊,可以檢視Objective-C指標章節。

現在,通過參照傳遞值來呼叫函式swap(),如下例所示 -

#import <Foundation/Foundation.h>

@interface SampleClass:NSObject
/* 方法宣告 */
- (void)swap:(int *)num1 andNum2:(int *)num2;
@end

@implementation SampleClass

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

   temp = *num1;  /* 儲存 num1 的值到 temp  */
   *num1 = *num2; /* 將 num2 的值分配給 num1 */
   *num2 = temp;  /* 將 temp 的值分配給 num2 */

   return;

}

@end

int main () {

   /* 區域性變數宣告 */
   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 );

   /* 呼叫函式來交換引數的值 */
   [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;
}

執行上面範例程式碼,得到以下結果:

2018-11-15 01:38:32.473 main[137544] Before swap, value of a : 100
2018-11-15 01:38:32.475 main[137544] Before swap, value of b : 200
2018-11-15 01:38:32.475 main[137544] After swap, value of a : 200
2018-11-15 01:38:32.475 main[137544] After swap, value of b : 100

從上面輸出的結果中可以看到,引數值的變化已經反映在函式之外,它不像按值呼叫那樣,函式內的引數值變化不會反映在函式之外。