为什么这不会令编译器满意,而转换应该像c一样工作,因为我可以在这里阅读How to cast an object in Objective-C
[p setAge:(NSNumber*)10];
,其中
- (NSNumber*) age {
return _age;
}
- (void) setAge: (NSNumber*)input {
[_age autorelease];
_age = [input retain];
}
答案 0 :(得分:49)
与earlier question形成对称,NSNumber
是对象类型。您需要通过方法调用来创建它,例如:
[p setAge:[NSNumber numberWithInt:10]];
您当前的代码只是尝试将任意整数10
强制转换为指针。 从不执行此操作:如果编译器没有警告您,那么您将尝试在内存位置10
访问一些完全不合适的字节,就像它们是{{1}一样对象,他们不会。做那些事会导致眼泪。
哦,只是为了抢占下一个明显的问题,请记住,如果你想在NSNumber
对象中使用该值,你需要通过方法调用来实现,例如:
NSNumber
(if ( [[p age] intValue] < 18 )
...
是不可变的,我认为它的实现使得相同的值被映射到同一个对象。所以它可能可能得到远离指针比较NSNumber
对象之间的值相等。但是请不要,因为这将不恰当地依赖于实现细节。请改用NSNumber
。)
答案 1 :(得分:26)
今天也可以使用简写表示法来实现:
[p setAge:@(10)];
答案 2 :(得分:6)
使用此:
[p setAge:[NSNumber numberWithInt:10]];
您无法将10
之类的整数文字强制转换为NSNumber*
(指向NSNumber
的指针)。
答案 3 :(得分:4)
因为NSNumber
是一个对象,而原始整数类型中的“10”,很像Java中int和Integer之间的区别。因此,您需要调用其初始化程序:
[p setAge:[NSNumber numberWithInt:10]
答案 4 :(得分:4)
NSNumber *yourNumber = [NSNumber numberWithInt:your_int_variable];