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

#iphone #objective-c #ios #nsnumber

#iPhone #objective-c #iOS #nsnumber

Вопрос:

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

Фон

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

Ответ №1:

Объект 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:amp;theNumber];
theCoreDataObject.number = theNumber;
  

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

4. (из комментария Грега) Аналогично варианту 1, но передает ключ методу update для большей переносимости.

 - (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"];

Комментарии:

1. Да, за исключением того, что в нем полностью забывается часть «(без создания нового объекта)»? О, подождите, вы не можете этого сделать. 😛

2. фантастический ответ ughoavgfhw

3. на самом деле я отмечаю, что с опцией 1 моя функция обновления больше не может использоваться повторно (поскольку она должна ссылаться на определенное свойство объекта core data).). Однако варианты 2 и 3 не так хороши для меня, поскольку для этого требуется вернуть номер в вызывающем абоненте. ВОПРОС — есть ли способ получить это, чтобы я мог (а) повторно использовать метод update в терминах разных свойств NSNumber, но также (б) заставить функцию update выполнять обновление и не полагаться на вызывающую программу для его последующей установки?

4. @Greg Конечно, вы могли бы добавить аргумент к методу update, который сообщает ему, какой ключ использовать. Я добавлю это в качестве опции 4.