0

私のプロジェクトには次のようなコードがあります。テーブルビューの各セルにビューコントローラーのビューを追加しています。

このような配列

NSMutableArray *arrTbl=[[NSMutableArray alloc] init];
NSMutableDictionary *dOne=[[NSMutableDictionary alloc] init];
myViewController *objVCtr=[[myViewController alloc] initWithNibName:@"myViewController" bundle:nil];
[dOne setValue:objVCtr forKey:@"cellVCtr"];

NSMutableDictionary *dTwo=[[NSMutableDictionary alloc] init];
myViewController *objVCtr1=[[myViewController alloc] initWithNibName:@"myViewController" bundle:nil];
[dOne setValue:objVCtr1 forKey:@"cellVCtr"];

NSMutableDictionary *dThree=[[NSMutableDictionary alloc] init];
myViewController *objVCtr2=[[myViewController alloc] initWithNibName:@"myViewController" bundle:nil];
[dOne setValue:objVCtr2 forKey:@"cellVCtr"];

[arrTbl addObjectsFromArray:[NSArray arrayWithObjects:dOne,dTwo,dThree,nil]];

さて、問題は、これをどのようにリリースするかです。

arrTbl は、ビューコントローラーの参照を持つ辞書と辞書を持つメイン配列です。

では、上記の文の後に次の文を書くべきでしょうか?

[dOne release];
[dTwo release];
[dThree release];
[objVCtr release];
[objVCtr1 release];
[objVCtr2 release];

上記のコードを書いた後、配列はView Controllerを指すことができますか?

要約すると、質問は次のとおりです。

  • 辞書には実際に何が含まれていますか?(View Controllerの数を保持するか、View Controllerの参照のみを保持しますか)
  • 配列には実際に何が含まれていますか? (辞書の数を保持するのか、それとも単に辞書を参照するのか?)
  • ここでは、View Controllerの配列と、異なる値を持つ各View Controllerが必要です(そのため、配列に辞書を追加しています)
4

2 に答える 2

1

コレクション(辞書や配列など)にオブジェクトを追加すると、コレクションは追加されているオブジェクトを保持します。

オブジェクトがコレクション内にある間だけ存続させたい場合は、次のように、オブジェクトをコレクションに追加する前に自動リリースするか、コレクションに追加した直後にオブジェクトを明示的にリリースすることをお勧めします。

MyObject *anObject = [[[MyObject alloc] init] autorelease];
[aDictionary setObject:anObject forKey:@"aKey"];

また

MyObject *anObject = [[MyObject alloc] init];
[aDictionary setObject:anObject forKey:@"aKey"];
[anObject release];

オブジェクトがコレクションから削除されると、コレクションはそれを解放することに注意してください。

これは、コレクションがオブジェクトの唯一の保持者である場合、コレクションから削除された後にオブジェクトの割り当てが解除されることを意味します。

于 2010-02-11T09:39:18.430 に答える
1

辞書と配列にはオブジェクトへのポインターが含まれていますが、これらのクラスの内部実装は重要ではありません。注意を払う必要があるのは、オブジェクトの所有権です。

http://boredzo.org/cocoa-intro/、特に次のように述べられているメモリ管理セクションをご覧ください。

  • セレクターに「alloc」または「new」という単語が含まれるメソッド、または名前に「Create」という単語が含まれる関数を使用してオブジェクトを作成した場合、そのオブジェクトを所有していることになります。
  • セレクターに「copy」という単語が含まれるメソッドを使用するか、名前に「Copy」という単語が含まれる関数を使用して既存のオブジェクトのコピーを作成する (またはそのような関数からオブジェクトを取得する) 場合、そのコピーを所有していることになります。
  • それ以外の場合は、オブジェクトを所有していません。
  • オブジェクトを所有している場合は、それを解放する義務があります。

あなたの場合、 を使用してオブジェクトを作成しているため、オブジェクトを-alloc所有し、責任を負います。したがって、はい、それらをアレイに追加した後に解放する必要があります。

NSArrayメンバーをNSDictionary保持するため、オブジェクトを配列またはディクショナリに追加すると、安全に解放できます。配列自体がオブジェクトを削除するか、それ自体の割り当てが解除されるまで、オブジェクトの割り当ては解除されません。

簡単にするために、自動解放されたオブジェクトを返す便利なコンストラクターを使用できます。

//note the autorelease when the view controllers are created
MyViewController* viewController = [[[MyViewController alloc] initWithNibName:@"myViewController" bundle:nil] autorelease];
NSDictionary *dOne = [NSDictionary dictionaryWithObject:viewController forKey:@"cellVCtr"];


MyViewController *objVCtr1 = [[[MyViewController alloc] initWithNibName:@"myViewController" bundle:nil] autorelease];
NSDictionary* dTwo = [NSDictionary dictionaryWithObject:objVCtr1 forKey:@"cellVCtr"];

MyViewController *objVCtr2 = [[MyViewController alloc] initWithNibName:@"myViewController" bundle:nil];
NSDictionary* dThree = [NSDictionary dictionaryWithObject:objVCtr2 forKey:@"cellVCtr"];

NSArray* arrTbl = [NSArray arrayWithObjects:dOne, dTwo, dThree, nil];

//do something with arrTbl
//make sure you retain it if you want to hang on to it
于 2010-02-11T09:55:51.377 に答える