将Objective-C NSNumber对象分配给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);但是,只有在我的主代码中声明并分配了变量时才可以。如果我将其声明为对象的实例变量,然后使用键值编码为其赋值,则其工作正常: 对

有人能解释一下为什么这在Objective-C中有效吗?我希望它会给出一个错误,因为一个对象被分配给一个int变量。我知道它确实有效,这很好,但我不明白为什么允许这样做

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中的更多信息。

您需要了解对象和基本类型之间的区别。