Objective-C setValue:c基本类型的forKey

koa*_*amo 9 c objective-c nsobject

我正在尝试使用大书呆子牧场书来教自己客观c,这是一本非常好的书,但某些方面让我很困惑.

本章讨论的是使用setValue:forKey函数,我理解这是NSObject中定义的方法.书中说你可以在像int或float这样的ac原语上使用它并给出这个例子

我有一个名为Appliance的自定义类,它是一个名为voltage整数实例变量,用于存储当前设备的电压我初始化一个名为

appliance *a = [[appliance alloc]init];
[a setValue:[NSNumber numberWithInt:240] forKey:@"voltage"];
Run Code Online (Sandbox Code Playgroud)

然后,他设置了一个定制的电压设定器,并在其被调用时记录电压以证明其有效

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

令我困惑的是NSNumber numberWithInt返回一个指向存储在堆上的NSNumber对象的指针是正确的吗?那么他如何使用%d标记记录存储在NSNumber中的整数.我明白这会记录一个整数,但不是传入的对象?此外我认为既然电压被定义为一个整数而不是指向它的指针,它就无法将地址保存到其内存中的对象上?或NSNumber强制它保持其内存地址而不实际将电压声明为指针?

对不起这一章的困惑基本上踢了我的屁股.

Mar*_*n R 26

对象和标量类型之间的转换由键值编码方法自动处理.从文档:

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

一旦valueForKey:确定了用于为指定键提供值的特定访问器方法或实例变量,它就会检查返回类型或数据类型.如果要返回的值不是对象,则为该值创建一个NSNumberNSValue对象,并在其位置返回.

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

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