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

时间:2013-08-03 18:32:02

标签: objective-c c nsobject

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

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

我有一个名为设备的自定义类,其中有一个名为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强制它保持其内存地址而不实际将电压声明为指针?

抱歉这一章的混乱基本上踢了我的屁股。

2 个答案:

答案 0 :(得分:25)

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

  

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

     

valueForKey:确定了特定的访问方法或   实例变量,用于提供指定的值   key,它检查返回类型或数据类型。如果值是   返回不是对象,创建了NSNumberNSValue对象   为该值而返回。

     

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

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

答案 1 :(得分:4)

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