4

私は、Objective-C 開発を学び始めた経験豊富な C/C++ プログラマーです。現在、UICatalog サンプルを調べていると、いくつかの場所で見たが理解できなかったイディオムの別のインスタンスに出くわしました。

コード:

ButtonsViewController *buttonsViewController = [[ButtonsViewController alloc] initWithNibName:@"ButtonsViewController" bundle:nil];
[self.menuList addObject:[NSDictionary dictionaryWithObjectsAndKeys:
                                       NSLocalizedString(@"ButtonsTitle", @""), kTitleKey,
                                       NSLocalizedString(@"ButtonsExplain", @""), kExplainKey, 
                                       buttonsViewController, kViewControllerKey, nil]];
[buttonsViewController release];

私の知る限り、これは ButtonsViewController を割り当てて初期化し、ButtonsViewController の NSDictionary を作成し、辞書を menuList と呼ばれる NSMutableArray に追加します (これは上記のコードが存在する MainViewController のメンバー変数です)。その後、必要に応じて MainViewController がディクショナリ エントリを使用してビューを buttonsViewController に切り替えます。

私の質問は: なぜこのコードの後でも buttonsViewController がまだ有効なのですか? 間に「保持」なしで割り当てられ、解放されました。NSDictionary または NSMutableArray に何かを追加すると、暗黙の「保持」がありますか? もしそうなら、私はそれをどうにかして理解できるはずだったのですか、それともあなたが読んで覚えなければならないことの1つにすぎませんか?

4

4 に答える 4

4

したがって、コレクションがオブジェクトを保持するため、オブジェクトが後で有効であることは事実ですが、そのように考えることが有用かどうかはわかりません。コレクションにオブジェクトを追加した後、そのオブジェクトをそのメソッドで使用する場合は、使用が完了するまで解放しないでください。

それを考える方法は次のとおりです。

1) 私は、私が作成したこのオブジェクトの所有権を主張しています

2) コレクションと私は両方ともこのオブジェクトの所有権を持っています

3) 今はコレクションだけです。オブジェクトの所有権がないため、オブジェクトを使用しないでください。

この場合、3 に注意を払わなくても技術的に回避できるという事実を無視してください。

これにより、何がオブジェクトを保持するかを考えるために NARC (new-alloc-retain-copy) ルールを使い続けることができます。

于 2011-01-19T04:46:58.597 に答える
4

コレクションに含まれるオブジェクトを保持することは、Cocoa フレームワークの標準的な手順です。そうです、可変配列はView Controllerを保持しています。

ドキュメントに特に記載がない限り、これは常に当てはまります。

于 2011-01-19T02:15:15.633 に答える
3

前述のように、NSDictionary と NSArray は、追加されたオブジェクトに保持メッセージを送信し、削除されたオブジェクトにもリリースを送信します。上記のコードは、buttonsViewController の所有権を概念的にディクショナリに転送しています。これを知る方法の例...ドキュメントから:

-addObject:forKey:

パラメータ: anObject - キーの値。オブジェクトは、ディクショナリに追加される前に保持メッセージを受け取ります。この値は nil であってはなりません。

-すべてのオブジェクトを削除

説明: 各キーおよび対応する値オブジェクトには解放メッセージが送信されます。

于 2011-01-19T02:24:57.587 に答える
1

はい、NSDictionary や NSMutableArray などのコンテナーは、入れたオブジェクトを保持 (辞書キーの場合はコピー) します。

Apple のCollections Programming Topicsガイドを参照してください。

于 2011-01-19T02:11:37.987 に答える