2009-05-27 21 views
9

私は目標Cを初めて使いました。ポインタをいつ使うべきか、そうでないときは、インスタンス変数を宣言するときの一般的な説明を得たいだけでした。Objective-Cのインスタンス変数ポインタ

私が考えることができる例は、UIViewとBOOLです。 UIView私はポインタを作成するだろう、私はそうではないだろう(コンパイラが私に叫んだので)。

一般的なガイダンスは素晴らしいと思います。

乾杯、

答えて

20

オブジェクトの場合は、ポインタ表記を使用します。 Cタイプ(INT、BOOL、長い、など)のすべてがオブジェクトではありません、あなたはそのメモリ位置へのポインタをしたい場合ので、あなただけのポインタを使用します。

NSObject *obj; 
UIView<Protocol> *obj; 
int integerVar; 
BOOL isTrue; 

特殊なケースは、それ自体である、idですオブジェクトへのポインタ、あなたが*を必要としないので:

id obj; 

少しトリッキー:

NSInteger int; 
NSNumber *number; 

NSIntegerは、適切なプラットフォーム固有のint型のTYですpe、NSNumberはint、float、または何を持つことができるオブジェクトです。

+2

ご回答ありがとうございます。 これで、Cタイプはどのようにメモリからクリーンアップされるのですか?それはObjective-Cフードの下で行われますか? – Meroon

+1

オブジェクトのインスタンス変数は、すべてオブジェクトのメモリ内に含まれています。オブジェクトのメモリが解放されると、それらはすべて消えます。オブジェクト型変数との違いは、変数がポインタであることです。つまり、変数自体がメモリ内の場所を指すだけです。ポインタ変数が消えても、それが指すメモリは引き続き割り当てられます。 – Chuck

+2

ヘッダーファイルには、ポインターで常に参照する構造体のtypedefを設定することがあることを忘れないでください。その場合、名前は「Ref」で終わります。例えばCGImage *のtypedefであるCGImageRef変数名に*をつけないと分かります。 – U62

5

ポインタは、割り当てられたメモリのアドレスを保持するために使用されます。ココアでオブジェクトを作成するときには、メモリを割り当ててアドレスをポインタに格納します。

BOOL、char、int値を格納します。

あなたは、あなたがそれにアクセスできるようにするには、そのメモリへのポインタを格納する必要があるので、アロケーションは、メモリを割り当てクラスを作成します。

NSMutableArray * arr = [[NSMutableArray alloc] init]; 

は、どのようにCタイプはメモリからクリーンアップされますか?

「シンプルな」タイプがスタックに割り当てられます。メソッドが呼び出されると、スタックにすべてのメソッド変数を保持するためのスペースが割り当てられます(さらに、パラメータや戻りアドレスなどの他のものも含まれます)。だからスタックが成長する。メソッドが返すと、スタックが縮小し、メソッドによって使用されたスペースが再利用されます。そうすれば、単純な型は 'クリーンアップ'されます。

実際には聞こえる音よりもはるかに簡単です。あなたの好奇心を満たすための詳細については、wikipedia Stack entry - section Hardware stacksをご覧ください。

メモリを割り当てると、そのメモリはヒープに割り当てられます。ヒープはアプリケーションの実行全体にあります。ヒープにメモリを割り当てたら、そのメモリにアドレスを取得します。このアドレスをポインタに格納します。ポインタはメモリアドレスを格納する単なる変数です。

メソッドが返ってきたときに、メソッド内で宣言された「単純な」変数(BOOL、int、charなど)にアクセスできなくなりましたが、ヒープのメモリはまだそこにあります。メモリのアドレス(ポインタなど)がまだある場合は、そのアドレスにアクセスできます。

「単純な」タイプのインスタンス変数(編集:内部オブジェクト?)はどうですか?

オブジェクト(ここでは目的CとCocoaについて説明しています)を作成し、オブジェクト全体にスペースを割り当てます。オブジェクトのサイズはすべての変数のサイズです(obj-cが他のものを追加するかどうかはわかりません)。したがって、インスタンス変数はヒープ上のオブジェクトメモリの一部です。オブジェクトを解放/削除すると、そのメモリは再利用され、オブジェクト内に格納されている変数にアクセスすることはできなくなります(obj-cでは解放を呼び出し、各オブジェクトは参照カウントを保持します。ヒープ上のメモリが再利用されます)。

+0

このメソッドのスコープ内のローカル変数の意味をマスクしています。しかし、単純なタイプのインスタンス変数はどうでしょうか? – Meroon

1

NSString、NSObject、NSViewなどのすべてのObjective-Cクラスは、NSUIntegerのようないくつかの特別な型を除いてポインタである必要があります。これはint型の単なるtypedefです。

NSString *stringyString = @"THIS STRING IS STRINGY!!!11"; 
NSOpenPanel *openPanel; 
NSObject *objectyObject; 
NSUInteger integeryInteger = 7; 

id以外の唯一のものは、オブジェクトへのポインタであるためです。

id pointerThatCanBeSetToAnyObject = [NSString stringWithString:@"HEYYYY"]; 

int型、float型、BOOL型などのCの型は、char配列のようなCの文字列を除いてポインタを必要としません。

int SEVEN = 7; 
float SIXPOINTTWO = 6.2; 
char *characterArray = "HEYYYYY"; 

最後に、CoreFoundationクラスにはハイブリッドがあります。多くのクラスがポインタになりますが、CFStringのようないくつかのクラスでは、CFStringRefはすでにポインタになります。多くのCFString関数はCFStringRefとして返します。 CFString *とCFStringRefは、NSString *(これはフリーダイヤルと呼ばれています)と互換性がありますが、最初にキャストした方がコンパイラはおそらく高く評価します。

CFString *veryStringyString = @"STRINGYNESS!!11!one"; 
CFStringRef especiallyStringyString = @"STRRRRRRINNNNNGGGGYYYYY"; 
NSString *STRINGYNESS = (NSString *)veryStringyString; 
関連する問題