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: andsetValue: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, anNSNumber orNSValue 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- method.Value
因此,在您的情况下,
您是正确的,因为您正在创建一个