来自NSMutableArray insertObject:atIndex的意外行为

时间:2011-06-23 21:05:20

标签: iphone objective-c nsmutablearray

我尝试使用..

创建一个数字从1到30的数组
NSMutableArray *numberOfdaysInAMonth = [[NSMutableArray alloc] init ] ;

for ( i=0; i< 30; i++){
    [numberOfdaysInAMonth  addObject:[NSNumber numberWithInteger:i+1]];
    NSLog (@"Element_numberofDaysinAMonth %i = %@", i, [numberOfdaysInAMonth objectAtIndex: i]); 
}

我有一个包含35个元素的数组,它们的值为null:

NSMutableArray *latestArrayForMonth = [[NSMutableArray alloc]init ];

for ( i=0; i<36; i++){        
    [latestArrayForMonth addObject:[NSNull null]];         
}

现在我想将numberOfDaysInAMonth中的值插入到index:1中的LatestArrayWithMonth statrting中:

for (i = 0; i < 30; i++){  
    [latestArrayForMonth insertObject:[numberOfdaysInAMonth objectAtIndex:i] atIndex:1];
    NSLog (@"Element_latestArrayForMonth %i = %@", i, [latestArrayForMonth objectAtIndex: i]);  
}

控制台上的输出是:

Element_latestArrayForMonth 0 = <null>
Element_latestArrayForMonth 1 = 2
Element_latestArrayForMonth 2 = 2
Element_latestArrayForMonth 3 = 2
Element_latestArrayForMonth 4 = 2
Element_latestArrayForMonth 5 = 2
.
.
.
Element_latestArrayForMonth 28 = 2
Element_latestArrayForMonth 29 = 2

为什么我输出所有2?

2 个答案:

答案 0 :(得分:1)

这是因为这一行:

[latestArrayForMonth insertObject:[numberOfdaysInAMonth objectAtIndex:i] atIndex:1];

因为你连续插入项目atIndex:1,因为'i'变量在循环中增加,所以数组中的项目数也是如此 - 因此在索引'i'处记录项目总是是同一个项目。

还请检查在索引1处插入对象是否是您想要做的事情 - Objective-C是零索引语言,这意味着数组中的第一项是在索引0处。

您可能希望删除latestArrayForMonth数组中的所有对象,只需使用addObject方法(或使用addObjectsFromArray快速添加数组中的所有项目。)

同样可能值得研究一个阵列充满'空'值的替代方法 - 我从未见过这种方法的用例,最好有一个空数组而不是一个充满'空'值的数组。

另外需要注意的是,由于您只是存储原始整数值,因此您可能会发现NSIndexSet比NSArray更适用(取决于发布代码的应用,但值得研究)。

答案 1 :(得分:0)

使用insertObject:... atIndex:1你在索引1插入第1个月(没有元素,因此它转到索引0),然后是第2个月(实际上是索引1)然后你继续插入2.之后5个元素你的数组看起来像这个1,5,4,3,2。你应该做的只是通过从索引中减去1来访问数组,但是如果你想从索引1开始访问,首先添加一个NSNull。

[latestArrayForMonth addObject:[NSNull null]];

for (i = 0; i < 30; i++){

    [latestArrayForMonth addObject:[numberOfdaysInAMonth objectAtIndex:i]];

    NSLog (@"Element_latestArrayForMonth %d = %@", i + 1, [latestArrayForMonth objectAtIndex: i + 1]);  

}