Iphone 如何结合“int”和“NSInteger”的优点`
一个看似简单的问题:我可以有某种数字对象,可以是nil,但可以像原语int一样赋值: 像这样:Iphone 如何结合“int”和“NSInteger”的优点`,iphone,objective-c,ios,nsnumber,Iphone,Objective C,Ios,Nsnumber,一个看似简单的问题:我可以有某种数字对象,可以是nil,但可以像原语int一样赋值: 像这样: NSNumber *n = nil; n = 3; if(n == nil){ // some actions... } else if (n == 1){ // some actions... } else { // some actions... } 感谢您的输入答案是否定的。如果变量是一个对象,您可以指定另一个对象 n = anotherNSNumbe
NSNumber *n = nil;
n = 3;
if(n == nil){
// some actions...
} else if (n == 1){
// some actions...
} else {
// some actions...
}
感谢您的输入答案是否定的。如果变量是一个对象,您可以指定另一个对象
n = anotherNSNumber;
或者,使用属性或方法设置值
然后,将该对象与另一个对象进行比较
if (n == anotherNSNumber) // Checks the reference
或者使用属性/方法比较其值
不,你不能。原因是
nil
是指向地址0x0
的指针,即nil==0
。因此,您将无法在0
和nil
之间消除歧义
更不用说它们也应该是不同类型的nil
用作指针,而像0或3这样的数字是标量
nil
定义为
#define nil NULL
NULL
的典型定义如下:
#define NULL ((void *)0)
不是你想的那样。没有 当你说:
NSNumber *n = nil;
您要说的是声明一个指向NSNumber对象的指针,但现在让它指向nil这没关系;因为您以后可能要做的是获取指向NSNumber对象的指针,然后将其分配给此变量,以便n
是一个无效NSNumber对象的指针
下一行:
n = 3;
您没有给对象赋值,而是说
n
指向地址3。它不是地址,也不包含对象。其他人提到的简短回答是“否”。但以下对代码的轻微修改将获得类似的结果:
NSNumber *nObject = [NSNumber numberWithInt:3];
int n = nObject.intValue; // Zero if nObject is nil
if(nObject == nil){
// some actions...
} else if (n == 1){
// some actions...
} else {
// some actions...
}
NSInteger与NSNumber不同。NSNumber是一个类,而NSInteger是一个类型定义。为什么不使用NSInteger或int?使用基本int可能是最简单的解决方案,但我喜欢这样一个事实,即对象可以是“空”的,因此是nil,这在int中显然是不可能的。如果nObject为nil,您确定n为0吗?我宁愿猜测它仍然未初始化,可以有任何值。当nObject为nil时,n的值实际上为零。这是因为发送到nil对象的消息将始终返回nil,并且nil是地址零<代码>NSNumber*nObject=nil;int n=nObject.intValue;NSLog(@“n的值为%d”,n)代码>将输出“n的值为0”
n = 3;
NSNumber *nObject = [NSNumber numberWithInt:3];
int n = nObject.intValue; // Zero if nObject is nil
if(nObject == nil){
// some actions...
} else if (n == 1){
// some actions...
} else {
// some actions...
}