1

在 Objective-C 2.0 中,我为 NSNumber 属性赋值:

myObject.myProperty = 5;

编译器告诉我:

ARC 不允许将“int”隐式转换为“NSNumber *”

所以我想,如果我这样做会发生什么:

myObject.myProperty = @5;

检查调试器中的属性显示:

_myProperty = (__NSCFNumber *) (int)5

这让编译器很高兴,似乎没有什么不好的事情发生,但我真的不明白发生了什么。

这个速记到底是做什么的,它安全吗?什么是 NSCFNumber?我在文档中没有看到它。

4

2 回答 2

2

AnNSNumber是一个对象,一个 int 是一个原始值。你可以将一个原语装箱成一个 NSNumber。

如果要将 int 转换为 float 或其他原始类型,或者因为您需要原始值的对象表示,则可以这样做。例如,像 NSDictionary 这样的一些类不允许您使用原始值作为它们的键。

@5 是简写,您可以在 NSHipster 上[NSNumber numberWithInt:5]阅读有关文字的更多信息。它是完全安全的,旨在使您的代码更快地键入和更易于阅读!

NSCFNumber 是 Apple 实际用于在幕后实现 NSNumber 的类,作为所谓的类集群的一部分。在这个阶段,您无需担心。

于 2013-10-03T15:36:26.383 回答
1

这不仅安全,而且是正确的。如果它不是编译器支持的功能,它将无法工作。它被称为字面数字定义。就像文字字符串 ( @"")、字典 ( @{}) 和数组 ( @[])。

于 2013-10-03T15:30:32.687 回答