メソッド引数のポインタ
メソッド引数のポインタ
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の値も変更されている。