自己紹介

自分の写真
最近、iphoneアプリをリリースしました。
UxU
無料アプリですので、是非遊んで下さい。 第二弾アプリ:工場夜景写真集 今後も色々なアプリをリリースしていく予定です。
次は、コスプレ or 漫画 or 騎乗日記

2011年3月4日金曜日

【Objective-c】 ポインタって何?

■ポインタとは?

変数のアドレスを持っている変数です。
アドレスって何?という話しになると思いますが、
メモリ内の住所です。
メモリって?という話しになるので、
「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 件のコメント:

コメントを投稿