Вы не можете поместить переменную в массив, и вот что такое myNumber
: переменная. Переменная является контейнером, а также массивом; разница в том, что переменная также не является объектом *, как массив, и вы можете помещать объекты только в массив.
То, что вы передаете addObject:
, это не переменная myNumber
, а объект, который она содержит. Это то, что вы добавляете в массив.
Чтобы добавить переменную вместо объекта внутри нее, вам нужно будет сделать addObject:&myNumber
, чтобы передать указатель на саму переменную. Но это не сработает по двум причинам:
- Как я уже говорил, переменная не является объектом, и вы можете добавлять только объекты.
- Поскольку это локальная переменная, она исчезнет при выходе из функции; тогда у вас есть указатель на мертвую память внутри вашего массива. Когда вы обращаетесь к тому, что находится по этому указателю, ваша программа падает.
Есть три решения, которые будут работать:
- Как предлагает f3lix, создайте изменяемый класс чисел и создайте свой числовой объект из этого класса вместо NSNumber. Вам нужно будет переопределить все примитивные методы NSValue, как описано в документации NSNumber .
- Заменить объект в массиве вместо того, чтобы изменять его. Конечно, для этого требуется доступ к массиву везде, где вы хотите изменить номер.
- Создайте класс объектов модели, у которого в качестве свойства указан номер.
Это последнее решение, на мой взгляд, правильное. Я сомневаюсь, что вы управляете только списком чисел; Скорее всего, вы показываете пользователю список того, что имеет номер в качестве свойства. Смоделируйте это в своем коде, и все станет намного проще.
Ваш код после замены пустых NSNumbers объектами модели будет выглядеть примерно так:
MyModelObject *myModelObject = [[[MyModelObject alloc] init] autorelease];
[myModelObject setNumber:[NSNumber numberWithDouble:42.0]];
[myArray addObject:myModelObject];
//Some time later, you decide to change the number.
[[myArray objectAtIndex:idx] setNumber:[NSNumber numberWithDouble:43.0]];
//Or:
for (MyModelObject *obj in myArray) {
[obj setNumber:1000.0];
}
* Я имею в виду объекты Какао. Язык C называет любой указатель, int и т. Д. «Объектом», но это другое определение.