如何在objective-c中设置NSNumber变量的值(不创建新对象)

Gre*_*reg 16 iphone objective-c nsnumber ios

如何在objective-c中设置NSNumber变量的值(不创建新对象)?

背景

  • 我正在使用Core Data并拥有一个具有NSNumber(动态属性)的托管对象
  • 将(通过引用)传递给另一个将更新它的方法
  • 不知道如何更新它?如果我分配另一个新的NSNumber东西不起作用,我想这是有道理的,然后它有一个指向不同的对象而不是核心数据对象(我猜)

ugh*_*fhw 16

NSNumber对象不可变.这意味着更改包含NSNumber的属性的唯一方法是为其提供新的NSNumber.要做你想做的事,你有三个选择:

1.将Core Data对象传递给方法,并直接设置属性.

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

被称为 [self updateNumberOf:theCoreDataObject];

2.让update方法返回一个新的NSNumber并在调用者中更新它.

- (NSNumber *)updateNumber:(NSNumber *)oldNumber {
    NSNumber *newNumber = ...; // create new number
    return newNumber;
}
Run Code Online (Sandbox Code Playgroud)

叫做使用:

NSNumber *theNumber = theCoreDataObject.number;
theNumber = [self updateNumber:theNumber];
theCoreDataObject.number = theNumber;
Run Code Online (Sandbox Code Playgroud)

3.将一个指针传递给一个数字变量并在调用者中更新它(如果你需要返回别的东西,我只会建议选项2).

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

叫做使用:

NSNumber *theNumber = theCoreDataObject.number;
[self updateNumber:&theNumber];
theCoreDataObject.number = theNumber;
Run Code Online (Sandbox Code Playgroud)

在任何这些例子中我都不打扰内存管理.确保适当地释放/自动释放对象.

4.(来自Greg的评论)与选项1类似,但是将密钥传递给更新方法以使其更具可移植性.

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

被称为 [self updateNumberOf:theCoreDataObject forKey:@"number"];