2

オブジェクトの名前の最初のアルファベットをキーとする NSMutableDictionary があります。ビューは、iPhone の「連絡先」タブのようなものです。さらに、ユーザーはリスト内の個々のオブジェクトを選択できます。

コードでは、選択した各オブジェクトを見つけてさらに処理します。

NSMutableArray *objectsToAdd = [[NSMutableArray alloc] init];
NSMutableArray *array      = nil;

for (NSString *key in self.nameIndex) {

    array = (NSMutableArray *)[searchedNameDictionary valueForKey:key];    
    for (Objects *eachObject in array) {
        if (eachObject.objectIsSelected){
            [objectsToAdd addObject:eachObject];
        }
    }           
}
[array release];

-(void)dealloc()
{
    [searchedNameDictionary release];
}

割り当て解除されたオブジェクトが参照されているというメッセージとともに、searchedNameDictionary を解放した場所でアプリがクラッシュします。

上記のコードで [array release] を削除すると、アプリは正常に動作します。

私の質問は、「配列」を解放すると、実際にsearchedNameDictionary内のオブジェクトが解放されるということです。これが起こっているようです。

配列を解放しないとメモリリークが発生しますか?

4

2 に答える 2

5

またはメソッドreleaseからのものでない限り、オブジェクトを返さないでください。alloccopy

それ以外の場合は、受け取った直後にオブジェクトautoreleasedを保持したい場合は、返されるオブジェクトはそれ以外の場合です。retain

于 2010-06-29T16:02:33.587 に答える
2

array =(NSMutableArray *)[searchedNameDictionary valueForKey:key];

これにより、自動解放されたオブジェクトが返されるため、解放する必要はありません。

他にもいくつかの問題があります...コードにも問題がありますが、ほとんどはスタイルの問題です。[アレイリリース]を取り除いてください。そうすれば、その問題に関する限り、問題は解決します。

于 2010-06-29T16:01:26.277 に答える