-3

当用 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: 怎么可能有任何好处,因为您总是会丢失对该索引处旧对象的引用。

这仅仅是为了避免解决问题,因为它符合旧的文档定义吗?

4

2 回答 2

12

这两种方法做不同的事情。想象一下以下数组:

NSMutableArray *anArray = [@[ @1, @2, @3 ] mutableCopy];

如果在 position插入一个元素1,如下所示:

[anArray insertObject:@4 atIndex:1];

数组变得等​​于@[ @1, @4, @2, @3 ]。插入新元素而不删除另一个元素。

相反,如果您替换position 处的元素1,如下所示:

[anArray replaceObjectAtIndex:1 withObject:@4];

你得到@[ @1, @4, @3 ]. 该位置的前一个对象被删除。

于 2012-12-18T20:52:16.140 回答
3

insertObject:atIndex正如您已经指出的那样,不会删除旧项目。相反,它会在您指定的索引处插入新项目。调用此方法后,数组的元素计数加 1。

这与 不同replaceObjectAtIndex:withOjbect,后者是替代品。数组的元素计数保持不变。

Insert 正是这样做的。考虑一个包含 5 个元素的数组:如果您调用[myArray insertObject:insertedObj atIndex:1];, myArray 实例现在有 6 个元素,并insertedObj在第一个索引处插入。

于 2012-12-18T20:51:40.267 回答