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

Objective-C setValue:forKey on c primitive types

我想用大书呆子牧场的书来教自己客观C,这是一本非常好的书,但某些方面让我困惑。

本章讨论的是使用setValue:forkey函数,我理解它是在nsObject中定义的一种方法。书中说可以在C原语上使用这个,比如int或float,并给出了这个例子

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

1
2
appliance *a = [[appliance alloc]init];
[a setValue:[NSNumber numberWithInt:240] forKey:@"voltage"];

然后,他为电压设置了一个自定义设置器,并在电压被调用以证明其工作时记录电压。

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

让我困惑的是,nsnumberWithint返回指向存储在堆中的nsnumber对象的指针是否正确?那么他如何使用%d标记记录存储在nsnumber中的整数呢?我知道这会记录一个整数,但不是一个正在传入的对象吗?此外,我认为既然电压被定义为一个整数,而不是一个指向某个东西的指针,它就不能把地址保存到内存中的某个对象上?或者,nsnumber是不是强迫它在没有电压声明为指针的情况下保持其内存地址?

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


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

The default implementations of valueForKey: and setValue:forKey:
provide support for automatic object wrapping of the non-object data
types, both scalars and structs.

Once valueForKey: has determined the specific accessor method or
instance variable that is used to supply the value for the specified
key, it examines the return type or the data type. If the value to be
returned is not an object, an NSNumber or NSValue object is created
for that value and returned in its place.

Similarly, setValue:forKey: determines the data type required by the
appropriate accessor or instance variable for the specified key. If
the data type is not an object, then the value is extracted from the
passed object using the appropriate -Value method.

因此,在您的情况下,intValue自动应用于通过的NSNumber上。对象,并将生成的整数传递给setVoltage:


您是正确的,因为您正在创建一个NSNumber实例并传递它。但是,你把它交给了setValue:forKey:,它正在为你做一些工作。它为voltage(setVoltage:)找到了合适的setter方法,在调用setter之前检查数据类型并将数字解除绑定到int中。