【问题标题】:Objective-C setValue:forKey on c primitive typesObjective-C setValue:forKey on c 原始类型
【发布时间】:2013-08-04 20:26:07
【问题描述】:

我正在尝试使用 big nerd 牧场书自学 Objective-c,这是一本非常棒的书,但某些方面让我感到困惑。

当前章节讲的是使用 setValue:forKey 函数,我理解是 NSObject 中定义的一个方法。这本书说你可以在像 int 或 float 这样的 c 原语上使用它,并给出了这个例子

我有一个名为 Appliance 的自定义类,其中有一个 名为 voltage 的整数实例变量,用于存储当前电器的电压 我初始化了一个名为

的新设备
appliance *a = [[appliance alloc]init];
[a setValue:[NSNumber numberWithInt:240] forKey:@"voltage"];

然后他为电压设置了一个自定义设置器,并在调用它时记录电压以证明它有效

-(void)setVoltage:int(x) {
NSLog(@"setting voltage to %d",x);
voltage =x;
}

让我困惑的是 NSNumber numberWithInt 返回一个指向存储在堆上的 NSNumber 对象的指针是否正确?那么他如何使用 %d 令牌记录存储在 NSNumber 中的整数。我知道这会记录一个整数,但不是传入的对象?此外,我认为由于电压被定义为整数而不是指向某物的指针,因此它不能将地址保存到内存中的对象?还是 NSNumber 是一种强制它保持其内存地址而不实际将电压声明为指针的方式?

对不起,这一章让我很困惑。

【问题讨论】:

  • 请注意,在正常的编码实践中,您通常不会使用setValue:forKey:valueForKey: 来设置/获取对象的值。只需直接调用 setter/getter 即可。 KVC 的存在主要是为了支持绑定和其他形式的元编程。

标签: objective-c c nsobject


【解决方案1】:

对象和标量类型之间的转换由键值编码方法自动处理。来自documentation

valueForKey:setValue:forKey: 的默认实现 为非对象数据的自动对象包装提供支持 类型,标量和结构。

一旦valueForKey: 确定了具体的访问方法或 用于提供指定值的实例变量 键,它检查返回类型或数据类型。如果值是 返回的不是对象,创建了 NSNumberNSValue 对象 获取该值并在其位置返回。

同样,setValue:forKey: 确定了所需的数据类型 指定键的适当访问器或实例变量。如果 数据类型不是对象,则从 使用适当的-<type>Value 方法传递对象。

因此,在您的情况下,intValue 会自动应用于传递的NSNumber 对象,并将结果整数传递给setVoltage:

【讨论】:

    【解决方案2】:

    您是正确的,因为您正在创建一个 NSNumber 实例并传递它。但是,您将它传递给setValue:forKey:,它正在为您做一些工作。它为voltage (setVoltage:) 寻找合适的setter 方法,在调用setter 之前检查数据类型并将数字拆箱成int

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-02
      相关资源
      最近更新 更多