NSMutableArray добавляют Объект как указатель только?

Как было сказано в комментариях: незнание вашей структуры данных затрудняет вашу помощь. В приведенном ниже примере я создал несколько примеров данных на первом этапе.

library(tidyverse)    

#Create some sample data
data <- tibble(
  text = c("President. - Are you Nikolaj Khvostov?",
           "Khvostov. - Yes Mr. President."))

#A print of the sample data
data

#Create a variable called "new_text" using the mutate() function
#The function str_remove() from the stringr package is used to remove the unwnted elements

data %>% 
  mutate(
    new_text = str_remove(text, pattern = "^[a-zA-Z]+\\. -"))
5
задан Peter Hosey 30 March 2009 в 10:58
поделиться

3 ответа

Вы не можете поместить переменную в массив, и это что myNumber : переменная. Переменная является контейнером и так является массивом; различие - то, что переменная не является также объектом*, как массив, и можно только поместить объекты в массив.

Чему Вы передаете addObject: не переменная myNumber, но объект это содержит. Это - то, что Вы добавляете к массиву.

Для добавления переменной вместо объекта в нем необходимо было бы сделать addObject:&myNumber, для передачи указателя на саму переменную. Но это не будет работать по двум причинам:

  1. Как я упомянул, переменная не является объектом, и можно только добавить объекты.
  2. Так как это - локальная переменная, она погибнет, когда функция выйдет; затем у Вас есть указатель на мертвую память в Вашем массиве. Когда Вы идете для доступа к тому независимо от того, что в том указателе, программа отказала бы.

Существует три решения, которые будут работать:

  1. Как f3lix предполагает, создайте изменяемый класс числа и создайте свой объект числа из этого класса вместо NSNumber. Необходимо будет переопределить все примитивные методы NSValue, как описано в документации NSNumber.
  2. Замените объект в массиве вместо того, чтобы видоизменить его. Конечно, это требует доступа наличия к массиву отовсюду, Вы хотели бы изменить число.
  3. Создайте класс объекта модели, который имеет число как свойство.

Тем последним решением является, по-моему, корректное. Я сомневаюсь, что Вы управляете только списком чисел; более вероятно Вы показываете пользователю список чего-то, что имеет число как свойство. Смоделируйте это в своем коде, и все становится намного более простым.

Ваш код после замены пустого 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 действительно называет любой указатель, интервал, и т.д. “объект”, но это - другое определение.

16
ответ дан 18 December 2019 в 05:40
поделиться

Ваша проблема состоит в том, что объекты NSNumber неизменны; подразумевать, что Вы не можете изменить их значение. Таким образом, для изменения значения, необходимо создать новый объект NSNumber. Например:

myNumber = [NSNumber numberWithDouble:[myNumber doubleValue]+1.0]

Теперь, конечно, у Вас есть точка myNumber к другому объекту, чем тот, который Вы добавили к массиву. Таким образом, необходимо обновить массив путем замены измененного объекта NSNumber:

[myArray replaceObjectAtIndex:0 withObject:myNumber]

Ну, это оставляет Вас с проблемой, что необходимо сохранить индекс вместе с каждым NSNumber, чтобы смочь обновить массив. Который является incovenient, если Вы хотите раздать NSNumber, возражают и позволяют изменять значение.

Вы могли решить эту проблему путем представления интерфейсного объекта, что Вы переносите NSNumber для разрешения прозрачных обновлений, или Вы просто могли создать свой собственный класс, который обрабатывает Ваш doubleValue (несколько изменяемый класс NSNumber).

10
ответ дан 18 December 2019 в 05:40
поделиться

При изменении указателя myNumber затем как Вы сказали, значение, сохраненное в массиве, не изменяется. Однако указатель, сохраненный в массиве, является копией myNumber, поэтому при изменении объекта, что myNumber указывает на объект, что элемент массива указывает на, отразит, что изменение, потому что это - тот же объект.

То, что Вы, кажется, хотите сделать, должно высказать мнение массива к другому объекту (каждый раз, когда Вы изменяете myNumber). Необходимо будет сделать это вручную при помощи, например-replaceObjectAtIndex:withObject: как так:

NSNumber *myNumber = [NSNumber numberWithDouble: 3.141592];
int myNumberIndex = [myArray count];
[myArray addObject: myNumber];

myNumber = ...; //whatever
[myArray replaceObjectAtIndex: myNumberIndex withObject: myNumber];

То, что этот код делает, в основном, является хранилищем индекс объекта, который Вы помещаете в myArray и затем заменяете тот объект новым.

3
ответ дан 18 December 2019 в 05:40
поделиться