0

iOS のメモリ管理を理解するのに苦労することがあります。

私はいくつかのアプリを引き継いで、それを開発しています。アプリは展開ターゲット 4.3 で開発されており、クライアントの要件により変更することはできません。

ピッカーを作成する方法があります。

NSMutableArray *arrayToLoad = [[NSMutableArray alloc] initWithObjects: obj, nil];
[arrayToLoad addObjectsFromArray: (NSMutableArray*)[valueArrays objectAtIndex: btn.tag]];
if( !picker )
{
    picker = [[WybierzZListyViewController alloc] initWithValues: arrayToLoad useObjectType: YES selectedIndex:0];
    [self.view addSubview: picker.view];
    picker.delegate = self;
    [picker animate];
}
else
{
    picker = [[WybierzZListyViewController alloc] initWithValues: arrayToLoad useObjectType: YES selectedIndex:0];
    [picker reuseWithValues: arrayToLoad useObjectType: YES selectedIndex: indexes[btn.tag]];
    [picker animate];
}

このelseブロック、特にメソッドreuseWithValuesは私に多くの問題を引き起こし、おそらくそれを一掃するでしょう.

以前の開発者は、新しいピッカーを最初から作成する代わりに、以前に作成したピッカーを再利用することについて正しかったですか? 合理的に聞こえますが、後で私にとって難しいことはほとんどありません。

picker = [[WybierzZListyViewController alloc] initWithValues: arrayToLoad useObjectType: YES selectedIndex:0];
[self.view addSubview: picker.view];
picker.delegate = self;
[picker animate];

else ブロックなしで、メモリ リークを回避します。理論的には、ピッカー変数の下に新しい ViewController を割り当てる必要がありますが、置き換えたものはどうでしょうか。交換する前に、どういうわけかそれを破壊する必要がありますか?

4

1 に答える 1

1

ピッカーを初期化するときにこのようにしてみてください

    NSMutableArray *arrayToLoad = [[NSMutableArray alloc] initWithObjects: obj, nil];
        [arrayToLoad addObjectsFromArray: (NSMutableArray*)[valueArrays objectAtIndex: btn.tag]];
        if( !picker )
        {

[picker.view removeFromSuperview];
picker.delegate = nil;
picker = nil
        }
            picker = [[WybierzZListyViewController alloc] initWithValues: arrayToLoad useObjectType: YES selectedIndex:0];
            [self.view addSubview: picker.view];
            picker.delegate = self;
            [picker animate];

これで問題が解決することを願っています。

于 2013-01-28T09:21:05.043 に答える