11

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

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

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

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 是一种强制它保持其内存地址而不实际将电压声明为指针的方式?

很抱歉这一章让我很困惑。

4

2 回答 2

26

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

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

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

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

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

于 2013-08-03T18:39:08.170 回答
4

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

于 2013-08-03T18:39:45.143 回答