1

[alloc] init]すでに初期化されて割り当てられているオブジェクトを呼び出すとどうなりますか?

私の特定のケースではNSMutableArray、スーパークラスで初期化するものがありParentますNSMutableArray* someArray = [NSMutableArray alloc] init];

サブクラスChildでは、オブジェクトをsomeArray特定のインデックス、たとえば3に挿入する必要があります。
したがって、配列にアイテムがない場合、または挿入しようとしているインデックスよりもアイテムが少ない場合(配列には4つのアイテムがあり、インデックスに挿入したい10)クラッシュします。

クラスsomeArrayで再度初期化するとどうなりますか?Childに保存されているポインタは、someArray初期化する新しいポインタに置き換えられ、「古い」ポインタはリークするだけでしょうか。

編集:

申し訳ありませんが、私の用語は少しずれていました。私はすることを意味しません[someObject alloc]が、以前のインスタンスで初期化されたsomeObject = [SomeClass alloc] init];場所で行うことsomeObjectSomeClass

4

3 に答える 3

5

[alloc] init]「オブジェクトを呼び出すとどうなるか...」と言うときの明確さのために、あなたの用語は間違っています。

次の行:

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

英語で読む:

allocメッセージをNSMutableArrayクラスオブジェクトに送信してinitから、最初のメッセージから返されたオブジェクトにメッセージを送信し、から返されたオブジェクトをinitという名前のポインタ変数に格納しますsomeArray。」

既存のオブジェクトに対して「alloc/initを呼び出さない」という事実を強調するために、新しいオブジェクトを作成し、前のオブジェクトへの参照よりもこの新しいオブジェクトへの参照を保存していると言います。その前のオブジェクトへの参照がなくなったため、そのメモリを適切に解放する機能が失われました。そのため、そうです、オブジェクトをリークします。

于 2012-09-18T18:21:47.990 に答える
4

正解です、漏れます。NSMutableArray insertObject:atIndexを使用します:

于 2012-09-18T18:16:53.930 に答える
1

私があなたが望むと思うことをするために頭に浮かぶいくつかの方法があります。一種の不器用なものは[NSNull null]、新しいオブジェクトを追加する必要がある場所までオブジェクトがいっぱいになるように、必要な数のオブジェクトを配列に配置することです。NSNull次に、独自のオブジェクトを保存している場合は、既存のものを置き換えます。

おそらく、より良いアプローチは、配列の代わりに辞書を使用して、インデックス値をキーに変換することです。

于 2012-09-18T18:20:06.887 に答える