Неожиданное поведение от NSMutableArray insertObject: atIndex - PullRequest
1 голос
/ 24 июня 2011

Я пытаюсь создать массив с номерами от 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 в статистику LatestArrayWithMonth из индекса: 1, используя:

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 ]

1 голос
/ 24 июня 2011

Это из-за этой строки:

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

Поскольку вы вставляете элемент atIndex:1 непрерывно, так как переменная 'i' увеличивается в цикле, так же как и количество элементов вмассив - таким образом, регистрация элемента в индексе 'i' всегда является одним и тем же элементом.

Пожалуйста, также проверьте, что вставка объекта в индекс 1 - это то, что вы хотите сделать - Objective-C - это ноль-индексированный язык, означающий, что первый элемент в массиве имеет индекс 0.

Возможно, вы захотите удалить все объекты в массиве latestArrayForMonth и просто использовать метод addObject (или использовать addObjectsFromArrayчтобы быстро добавить все элементы из массива).

Также может быть полезно изучить альтернативные подходы к созданию массива, заполненного «пустыми» значениями - я еще никогда не видел варианта использования для этого подхода, лучшеиметь пустой массив, чем массив, заполненный «пустыми» значениями.

Еще одна вещь, на которую следует обратить внимание: поскольку вы просто храните примитивные целочисленные значения, вы можете найти NSIndexSet более подходящим для использования.чем NSArray (зависит от применения размещенного кода, но заслуживает расследования).

0 голосов
/ 24 июня 2011

Используя 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]);  

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...