NSMutableArray 内の特定のインデックスの値を新しい値に置き換えると、古い値がメモリに保持されます。修正すべきハックは、すべてのループの前に新しい NSMutableArray を初期化することです。
再現する手順:
- (id) init{
self.overlays = [[NSMutableArray alloc] initWithCapacity: [self.anotherArray count]];
}
- (void) someOtherMethod{
for(int i = 0 ; i < self.anotherArray ; i++){
UIView *view = [[UIView alloc] initWithFrame:CGRectMake(x, y, width, height)];
[view setBackgroundColor:[UIColor colorWithRed:0
green:0
blue:0
alpha:1]];
[view setAlpha: .2];
[self.overlays insertObject:view atIndex: i]
}
}
- (void) main{
for(int i = 0 ; i < 4 ; i++){
[myObject someOtherMethod];
}
}
insertObject:atIndex は、配列内のそのインデックスの古い値を解放しないため、効果的にメモリ リークを引き起こします。
私はバグレポートを提出し、Apple は次のように回答しました。
insertObject:atIndex: は定義どおりに動作しています。置換ではなく、挿入を行っています。置換が必要な場合は、代わりに -replaceObjectAtIndex:withObject: を使用する必要があります。
そのインデックスで古いオブジェクトへの参照を常に失うため、insertObject:atIndex: がどのように役立つでしょうか。
これは単に、古いドキュメントの定義を満たしているため、問題の修正を避けるためですか?