0

Objective-Cで簡単に言えば-私は仮定するときに正しいですか

  1. すべてのポインタ変数は、使用されなくなったときに解放する必要がありますか?
  2. すべてのポインタ変数(*)はある種のクラスであるかどうか?
  3. したがって、すべてのポインタ変数は、「alloc」と「init」(または同様のもの)を使用して割り当ておよび初期化する必要がありますか?
  4. Objectメソッドを使用して変数を宣言する場合、「alloc」または「init」は必要ない場合がありますか?
  5. 数値宣言(BOOL、int、floatなど)は、ポインターとして宣言されていない限り、メモリ管理を必要としませんか?

私の混乱を整理するのに役立つアドバイスをありがとうiFloh

4

3 に答える 3

3

1) すべてのポインター変数は、使用されなくなったら解放する必要がありますか?

尖ったものを「所有」しているかどうかによって異なります。これらのメモリ管理ルールを注意深く読んで、ポインターを解放する方法を学ぶことをお勧めします。

2) すべてのポインター変数 (*) は何らかのクラスですか?

すべてのポインターではありません。ポインター変数は、オブジェクトまたはメモリーのブロックへのポインターを保持できます。それは単なる何かへのポインタです。

3) したがって、すべてのポインタ変数は、「alloc」と「init」(または同様のもの) を使用して割り当ておよび初期化する必要がありますか?

すべてのポインターではありません。ポインター変数は、オブジェクトまたはメモリーのブロックへのポインターを保持できます。指摘されたものは、既存のオブジェクトまたは割り当てられたメモリのチャンクである可能性があります。

4) Object メソッドを使用して variale を宣言する場合、「alloc」または「init」は必要ないのでしょうか?

毎回ではありません。誰が割り当てて初期化したかを知らなくても、存在するオブジェクトへのポインタを取得できます。ここでも、従うべき所有権のルールがいくつかあります。これらのメモリ管理規則を注意深く読むことをお勧めします。

5) 数値宣言 (BOOL、int、float など) は、ポインターとして宣言されていない限り、メモリ管理を必要としませんか?

はい。プリミティブ型と呼ばれるものがあり、値として操作する限り、メモリ管理を行う必要はありません。

于 2010-03-04T17:02:46.427 に答える
2

使用されなくなったときにすべてのポインター変数を解放する必要がありますか?

「ポインター変数」が 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 インスタンスを保持するためにスタック上の領域のチャンクを切り出します。

何かを初期化する必要がある何かへのポインターがある場合、それは多くの場合、割り当てによって行われます (常にではありません)。

于 2010-03-04T16:56:47.580 に答える
0

私はあなたが正しいと信じています:

  1. はい。

  2. 私は推測する。質問を理解しているかどうかわかりません。

  3. 種類:あなたが言ったように、特定のクラスメソッドを使用する場合、必ずしもalloc+ではありません。initしたがって、割り当てと初期化は暗黙的に行われます。

  4. 正しい。(上記を参照)

  5. それは数値以上のものであり、C プリミティブはメモリ管理を必要としないと私は信じています。

Apple のメモリ管理規則と iPhone プログラミングのスタンフォード クラスを読むことをお勧めします。

于 2010-03-04T16:01:57.330 に答える