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

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

Задний план

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

person Greg    schedule 11.05.2011    source источник


Ответы (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"];

person ughoavgfhw    schedule 11.05.2011
comment
Да, кроме того, что он полностью забывает часть (без создания нового объекта)? Ой, подождите, вы не можете этого сделать. :П - person Santiago V.; 12.05.2011
comment
фантастический ответ ughoavgfhw - person Greg; 12.05.2011
comment
на самом деле я отмечаю, что с помощью варианта 1 моя функция обновления больше не может использоваться повторно (поскольку она должна ссылаться на конкретное свойство в основном объекте данных). Однако варианты 2 и 3 не так хороши для меня, поскольку они требуют установки номера в вызывающем абоненте. ВОПРОС - есть ли способ сделать это так, чтобы я мог (а) повторно использовать метод обновления с точки зрения различных свойств NSNumber, НО также (б) иметь функцию обновления, выполняющую обновление, а не полагаться на вызывающего абонента, чтобы установить его впоследствии? - person Greg; 12.05.2011
comment
@Greg Конечно, вы можете добавить аргумент к методу обновления, который сообщает ему, какой ключ использовать. Я добавлю это как вариант 4. - person ughoavgfhw; 12.05.2011