アドレスって何?という話しになると思いますが、
メモリ内の住所です。
メモリって?という話しになるので、
「PCの記憶する領域に対する格納先を示すもの」です。
◎重要:
----------
配列を引数にできないというC言語のルールです。
よって、Objective-cでも同様です。
【利用シーン1】:配列を引数とする場合
--------------------------------
@interface MyClass
{
int _doubleDigits[10];
}
@property(readonly) int *doubleDigits;
@end
@implementation MyClass
- (int *)doubleDigits
{
return _doubleDigits;
}
@end
【利用シーン2】:クラスを定義する場合
-------------------------------------
CLLocationManager *locMgr = [[[CLLocationManager alloc] init]retain];
■ポインタのポインタとは?
ポインタ変数も独自のアドレスを持つ変数です。
いまいち、理解できないですよね。
クラスはポインタで定義しますよね。
それは、メモリ内のどこを参照すれば良いのかをPCに教える為です。
(正確に言うと、クラスをポインタで定義しない方法もありますが・・・
それを今話すとややこしいので割愛します)
関数の引数にポインタのポインタでクラスの変数を渡す場合、
関数内での値設定を受け取る事ができます。
【利用シーン1】:(参照渡し)関数内での値の設定を受け取りたい場合
------------------------------------------------
関数側:
+(void)setMessageElement:(TBXMLElement *)element toMessage:(Message**)aMsg
{
[*aMsg setTest:[TBXML textForElement:test]];
}
呼び出し側:
Message* msg = [[Message alloc] init];
[self setMessageElement:msgsElement toMessage:&msg];
◎重要:
----------
このようにポインタを引数にすれば、関数内での値の変更を受け取れます。
つまり、関数を呼び出す側にしてみれば「この変数に値を設定してくれ」と要求していることになります。
ライブラリを見る際に、引数に**があれば、「結果が格納される」と見れば良いわけです。
objective-cを網羅的に一回は調べた方が良いです。
これから、objective-cをやるなら下記の本は必読です。
0 件のコメント:
コメントを投稿