Objective-C NSNumber numberWithLongLong创建整数

use*_*446 3 xcode objective-c nsnumber long-long

当我尝试使用numberWithLongLong创建一个NSNumber,其数字大于-2且小于13时,它返回一个被转换为(int)的数字.

我看到这个,如果我踩到我的线后看Xcode调试器.

NSNumber* numberA = [NSNumber numberWithLongLong:-2]; //Debugger shows as (long)-2
NSNumber* numberB = [NSNumber numberWithLongLong:-1]; //Debugger shows as (int)-1
NSNumber* numberC = [NSNumber numberWithLongLong:12]; //Debugger shows as (int)12
NSNumber* numberD = [NSNumber numberWithLongLong:13]; //Debugger shows as (long)13

为了将我的问题放在上下文中,我使用了一个很长的值来创建一个纪元日期,我将最终使用BSON进行序列化并通过网络发送到Web服务.Web服务要求日期为java Long.

提前致谢

rob*_*off 6

您已经发现NSNumber(实际上,它的CFNumber对应物)具有-1到12之间的整数缓存.看看CFNumberCreate函数,CFNumber.c看看它是如何工作的.

看起来您可以通过传递自己的分配器来强制它不使用缓存CFNumberCreate.你需要查看CFAllocator文档.

但请注意,CFNumberCreate手册说明了这一点:

theType创建新CFNumber对象时不一定保留该参数.

所以,即使你绕过缓存,你可能不回来了一个对象,其objCTypeq(这意味着long long).看起来当前的实现将返回,q但在未来的版本中可能会发生变化.

NSNumber如果需要保证objCType返回,则可以编写自己的子类q.阅读NSNumber类参考中的"Subclassing Notes".