2009-06-18 8 views
42

と宣言しないのはなぜですか?私はiTunes UのスタンフォードからのiPhoneコースで私の手を試しています。私はポインタについて少し混乱しています。最初の割り当てでは、私はエラーを生成し、このNSIntegerを*

NSString *processName = [[NSProcessInfo processInfo] processName]; 
NSInteger *processID = [[NSProcessInfo processInfo] processIdentifier]; 

のようなものをやってみました、盲目的周りtinkeingた後、私はそれが問題を引き起こしていたNSIntegerラインで*であることを発見しました。

私は明らかに何が起こっているのか分かりません。私はそれがうまくいくと思うし、おそらく誰かがこの欠陥を指摘するのに十分なほど親切になるだろうと説明します。

ウェブ開発とは異なり、私は今、ウェブ開発よりもメモリについて心配するには が必要です。したがって、私が 変数を作成すると、 ビットのメモリが割り当てられます(RAM I と仮定します)。 変数を渡す代わりに、私は そのメモリの周りのポインタを渡します。 ポインターは、 の変数名の先頭に*を付けて宣言します。

私が正しいと仮定すると、なぜ私はNSIntegerのためにそれを行う必要がないのですか?

答えて

68

NSIntegerはプリミティブタイプであり、をスタックにローカルに格納できることを意味します。ポインタにアクセスする必要はありませんが、必要に応じてポインタを使用することができます。行:

NSInteger *processID = [[NSProcessInfo processInfo] processIdentifier]; 

実際の変数ではなく、そのアドレスを返します。これを修正するには、*を削除する必要があります。

NSInteger processID = [[NSProcessInfo processInfo] processIdentifier]; 

あなたが本当に1が必要な場合はNSIntegerへのポインタを持つことができます。

NSInteger *pointerToProcessID = &processID; 

アンパサンドは、オペレータのアドレスです。変数の整数ではなく、メモリ内の変数のアドレスに等しいNSIntegerにポインタを設定します。

+0

私はそれが非常に便利なヒントになると思う。ありがとう。 – gargantuan

+2

webdevからiPhone開発に移行したとき、それは私にとって大きな問題でした。他の1つは、NSArrayをnilで終了させることです。 –

+3

NSIntegerやXcodeで混乱している他のタイプをAppleダブルクリックすると、その定義に移ることができます。この場合、次のようになります。 typedef int NSInteger; 結局のところ、これは普通の古いintです。 –

25

NSInteger*と宣言しない理由は、オブジェクトではないためです。 NSIntegerは単にint又はlongある:

#if __LP64__ 
typedef long NSInteger; 
#else 
typedef int NSInteger; 
endif 

それは32ビットのアプリケーションで使われている場合、それは32ビット整数だし、それは64ビットのアプリケーションに内蔵されていた場合、それは64ですビット整数。

はもちろん、あなたがポインタとしてNSIntegerを渡すことができますが、ほとんどの機能は、単にNSIntegerはなく、それへのポインタとして引数を取ります。

オブジェクトは、ポインタとして他の関数に渡すことしかできません。これは、オブジェクトには動的にメモリが割り当てられているため、スタック上で宣言することができないためです。 intまたはlongには一定のメモリが割り当てられているため、これは問題ではありません。

2

NSIntegerはint型AFAIKの単なるtypedefです。

+1

これは可能ですが、どこにでもあるわけではありません。 64ビットMac OS Xシステムでは、 'NSInteger'は' long'と定義されています。いつかiOSを実行するアーキテクチャでこれが当てはまるかもしれないと想像するのは難しいことではありません。 –

3

*は、「ポインタ」を意味します。オブジェクト変数はオブジェクトへのポインタを保持しているので、*です。 NSInteger変数はNSIntegerへのポインタではなくNSIntegerを保持するので、*はありません。その変数に*を入れると、ポインタ変数に整数を入れているので少なくとも警告が出ます。

関連する問題