Как установить значение переменной NSNumber (без создания нового объекта) в target-c - PullRequest
16 голосов
/ 12 мая 2011

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

Фон

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

1 Ответ

16 голосов
/ 12 мая 2011

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

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

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

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

2. Пусть метод update вернет новый номер 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"];

...