我正在尝试使用大书呆子牧场书来教自己客观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强制它保持其内存地址而不实际将电压声明为指针?
抱歉这一章的混乱基本上踢了我的屁股。答案 0 :(得分:25)
对象和标量类型之间的转换由键值编码方法自动处理。来自documentation:
valueForKey:
和setValue:forKey:
的默认实施 为非对象数据的自动对象包装提供支持 类型,标量和结构。
valueForKey:
确定了特定的访问方法或 实例变量,用于提供指定的值 key,它检查返回类型或数据类型。如果值是 返回不是对象,创建了NSNumber
或NSValue
对象 为该值而返回。同样,
setValue:forKey:
确定了所需的数据类型 指定键的适当访问器或实例变量。如果 数据类型不是对象,然后从中提取值 使用适当的-<type>Value
方法传递对象。
因此,在您的情况下,intValue
会自动应用于传递的NSNumber
对象,结果整数传递给setVoltage:
。
答案 1 :(得分:4)
你是正确的,因为你正在创建一个NSNumber
实例并传递它。但是,你将它传递给setValue:forKey:
,它正在为你做一些工作。它为voltage
(setVoltage:
)找到了合适的setter方法,在调用setter之前检查数据类型并将数字拆分为int
。