Как установить значение переменной NSNumber (без создания нового объекта) в objective-c

как установить значение переменной NSNumber (без создания нового объекта) в objective-c?

Фон

  • Я использую Core Data и имею управляемый объект с NSNumber (динамическое свойство)
  • передача (по ссылке) этого другого метода, который будет его обновлять.
  • Не знаете, как его обновить? если я его выделяю, то новые NSNumber вещи не сработают, что, я думаю, имеет смысл, а затем получил указатель на другой объект, а не на основной объект данных (я думаю)

Ответы

Ответ 1

Объект NSNumber не изменен. Это означает, что единственный способ изменить свойство, содержащее NSNumber, - дать ему новый NSNumber. Чтобы сделать то, что вы хотите, у вас есть три варианта:

1. Передайте объект Core Data методу и непосредственно установите его свойство.

- (void)updateNumberOf:(MyCoreDataObject *)theObject {
    NSNumber *newNumber = ...; // create new number
    theObject.number = newNumber;
}

Вызывается как [self updateNumberOf:theCoreDataObject];

2. Попросите метод обновления вернуть новый NSNumber и обновить его в вызывающем.

- (NSNumber *)updateNumber:(NSNumber *)oldNumber {
    NSNumber *newNumber = ...; // create new number
    return newNumber;
}

Вызывается с помощью:

NSNumber *theNumber = theCoreDataObject.number;
theNumber = [self updateNumber:theNumber];
theCoreDataObject.number = theNumber;

3. Передайте указатель на числовую переменную и обновите ее в вызывающем объекте (я бы предложил только этот вариант 2, если вам нужно вернуть что-то еще).

- (void)updateNumber:(NSNumber **)numberPointer {
    if(!numberPointer) return; // or possibly throw an error
    NSNumber *oldNumber = *numberPointer;
    NSNumber *newNumber = ...; // create new number
    *numberPointer = newNumber;
}

Вызывается с помощью:

NSNumber *theNumber = theCoreDataObject.number;
[self updateNumber:&theNumber];
theCoreDataObject.number = theNumber;

Я не беспокоился об управлении памятью в любом из этих примеров. Убедитесь, что вы правильно освобождаете/сохраняете объекты.

4. (из комментария Грега) Подобно опции 1, но передает ключ к методу обновления, чтобы быть более портативным.

- (void)updateNumberOf:(id)theObject forKey:(NSString *)key {
    NSNumber *oldNumber = [theObject valueForKey:key];
    NSNumber *newNumber = ...; // create new number
    [theObject setValue:newNumber forKey:key];
}

Вызывается как [self updateNumberOf:theCoreDataObject forKey:@"number"];