思い立ったが吉日!

iOSが好きです。

メソッド引数のポインタ

メソッド引数のポインタ

Objective-Cを書いているとメソッドの引数に

+(void)setMessageElement:(TBXMLElement *)element toMessage:(Message**)aMsg 
{
[*aMsg setTest:[TBXML textForElement:test]];
}
[self setMessageElement:msgsElement toMessage:&msg];

このように**や&が付いている場合がある。

この**や&はなんだろう?と調べるとポインタを引数に渡しているようである。

関数定義側が**の引数を取るときは、呼び出す側は&で渡す必要があるらしい。

ポインタを渡すと渡した変数の値がメソッド内で変更された時、元の変数の値も変更されているということらしい。

値渡しと参照渡しの違いのようである。

C言語ベースで値渡しと参照渡しの挙動の違いを例示していく。

渡ってきた値を入れ替えるメソッド

値渡し

void swap(int x, int y)
{
    int tmp;
    tmp = x;
    x = y;
    y = tmp;
}

int num1 = 10;
int num2 = 5;

hogehoge.swap(num1,num2);

printf(num1);     // 10
printf(num2);    //   5

元の値は変化していない

参照渡し

void swap(int *pX, int *pY)
{
    int tmp;
    tmp = *pX;
    x = *pY;
    y = tmp;
}

hogehoge.swap(num1,num2);

printf(num1);     // 5
printf(num2);    //  10

元の値が変更されている

つまり最初の例で示したポインタを渡すメソッドは、参照渡しとなっており、&msgはメソッド内で値が変更されたら、呼び出し側のmsgの値も変更されている。