将Objective-C NSNumber对象分配给int变量的说明?
有人能解释一下为什么这在Objective-C中有效吗?我希望它会给出一个错误,因为一个对象被分配给一个int变量。我知道它确实有效,这很好,但我不明白为什么允许这样做将Objective-C NSNumber对象分配给int变量的说明?,objective-c,key-value,instance-variables,key-value-coding,Objective C,Key Value,Instance Variables,Key Value Coding,有人能解释一下为什么这在Objective-C中有效吗?我希望它会给出一个错误,因为一个对象被分配给一个int变量。我知道它确实有效,这很好,但我不明白为什么允许这样做 int i = [NSNumber numberWithInt:123]; 此外,这似乎存储了错误的值(即,在我的系统上,当我使用NSLog打印“I”的值时,我得到的是“252711”,而不是123);但是,只有在我的主代码中声明并分配了变量时才可以。如果我将其声明为对象的实例变量,然后使用键值编码为其赋值,则其工作正常: 对
int i = [NSNumber numberWithInt:123];
此外,这似乎存储了错误的值(即,在我的系统上,当我使用NSLog打印“I”的值时,我得到的是“252711”,而不是123);但是,只有在我的主代码中声明并分配了变量时才可以。如果我将其声明为对象的实例变量,然后使用键值编码为其赋值,则其工作正常:
对象实例变量
@interface myObject : NSObject
{
int anInt;
}
主代码
[myObject setValue:[NSNumber numberWithInt:123] forKey:@"anInt"];
NSLog(@"%@", [myObject valueForKey:@"anInt"]);
这段代码按预期打印出“123”,但我不确定为什么在使用上述看似类似的方法时,它不能正常工作。它不能“工作”,并且有一个编译器警告。可以编译它的原因是NSNumber
类方法numberwhithint
返回一个指针,该指针可以隐式转换为int
。打印出来时,您将获得分配objective-c对象的地址
SetValue:forKey:
方法不接受int
参数,它接受一个id
,它只是一个指向通用Objective-C对象的指针。键值编码负责为您分配NSNumber
对象的intValue
。执行代码时:
int i = [NSNumber numberWithInt:123];
您只需将指针值指定给int。numberwhithint:
返回NSNumber*
,它是一个指针,指向内存中分配了NSNumber
对象的某个位置。
现在i
的值不是123
,而是NSNumber*
指针的十进制表示形式阅读C/Objective-C中的更多信息。您需要了解对象和基本类型之间的区别。