使用されなくなったときにすべてのポインター変数を解放する必要がありますか?
「ポインター変数」が Objective-C クラスのインスタンスを指し、そのインスタンスを以前に保持した場合のみ。 これを読んでください: メモリ管理ガイド。
すべてのポインター変数 ( **) は何らかのクラスですか?*
ポインター変数がクラスのインスタンスへのポインターとして宣言されている場合、クラスのインスタンスを指します。そうでなければ、そうはなりません。ポインターはまさにそれです。メモリのチャンクへのポインター (参照)。そのメモリのチャンクは、クラス、クラスのインスタンス、C 構造体、生のバッファ (またはその他のもの) である可能性があります。
したがって、すべてのポインター変数は、「alloc」および「init」(または同様のもの) を使用して割り当ておよび初期化する必要がありますか?
ポインターが Objective-C クラスのインスタンスを指している場合のみ。C 構造体の場合は、 を使用できますmalloc()
。Objective-C クラスの場合でも、alloc
何もできない可能性があります。
NSString *foo = [NSString stringWithFormat: @"Hello, %@", @"World!"]; NSString *bar = @"bar"; NSBundle *main = [NSBundle mainBundle];
(ところで:上記のどれも必要ありません-release
。)
Object メソッドを使用して variale を宣言する場合、「alloc」または「init」は必要ないのでしょうか?
この質問は、Objective-C 言語ガイドを読んで再読する必要があることを示しています (Objective-C コードを書いた最初の 10 年間、18 か月ごとに約 1 回読み、毎回何かを学びました) 。
おそらく、C 言語自体についても読む必要があります。これは、ポインターと他のタイプを理解するのに役立つでしょう。
数値宣言 (BOOL、int、float など) は、ポインターとして宣言されていない限り、メモリ管理を必要としませんか?
はい。ただし、タイプ固有のものよりもはるかに簡単です。int foo;
int に相当するデータを格納するために、ローカル スコープ (通常はスタック上) に少しスペースを確保するようにコンパイラに指示しているとします。と言うときint *foo;
は、int を含むメモリ内の場所へのポインターを格納するため、つまりアドレスを格納するために、ローカル スコープ内に少しスペースを切り開くようにコンパイラに指示しています。
したがって、NSArray *bar
は単なるインスタンスへのポインタであり、そうです、NSArray bar;
明示的に禁止されていなければ、NSArray インスタンスを保持するためにスタック上の領域のチャンクを切り出します。
何かを初期化する必要がある何かへのポインターがある場合、それは多くの場合、割り当てによって行われます (常にではありません)。