2

私は、実行時に (キーと値のペアの) 値が NSMutableArrays になる NSMutableDictionary を構築する iPhone アプリに取り組んでいます。Objective-C に少し慣れていないので、次のようにするとメモリ リークが発生するのではないかと心配しています。

- (void) addNewSupplierPhoto:(UIImage*)image toSupplierID:(NSInteger*) supplierID{
NSMutableArray* supplierPhotoArray = [supplierPhotos objectForKey:supplierID];
if(supplierPhotoArray == nil)
{
    supplierPhotoArray = [[NSMutableArray alloc] init];
    [supplierPhotos setObject:supplierPhotoArray forKey:supplierID];
    [supplierPhotoArray release];
}
}

supplyPhotos は、包含クラスのメンバー変数である NSMutableDictionary です。

ご覧のとおり、構造体に入れる新しい UIImage* を受け入れるときは、まず、2 番目の引数 (supplierID) に対応するキーと値のペアのオブジェクトが nil かどうかを確認します。nil の場合は、新しい NSMutableArray を割り当て、そのキーのオブジェクトとして設定してから解放します。このメソッドを含むクラスの dealloc で NSMutableDictionary を dealloc すると仮定すると、参照は解放されますか? NSMutableDictionary の割り当てを解除する前に、それを実行して、含まれている個々の NSMutableArray の割り当てを解除する必要がありますか?

ありがとう、

ベン B.

4

2 に答える 2

5

ディクショナリや配列などのコンテナにオブジェクトを追加すると、retainが自動的に呼び出され、ディクショナリの質問としてコンテナを解放すると、すべてのオブジェクトの「release」が呼び出され、オブジェクトのメモリの割り当てが解除されます。

于 2010-02-21T08:53:48.150 に答える
0

このメモリ管理は私には正しいようです。割り当てた 1 つのコピーを解放すると、配列に追加すると別の参照が配列に保持されるため、正味カウントは 1 であり、これは正しいことです。

于 2010-01-18T19:45:43.443 に答える