Cocoa 将int32\t存储在NSDictionary中

Cocoa 将int32\t存储在NSDictionary中,cocoa,numbers,boxing,Cocoa,Numbers,Boxing,如何在NSDictionary中存储int32\u t类型的变量(例如ABPropertyID) [NSNumber numberwhithint:…]似乎不起作用 谢谢 从评论中: NSLog(@" %@ %@ ", [NSNumber numberWithLong:kABPersonFirstNameProperty], kABPersonFirstNameProperty); 打印:0(空)有什么想法吗?+[NSNumber numberWithInteger:将在所有32位和64位系

如何在
NSDictionary
中存储
int32\u t
类型的变量(例如ABPropertyID)

[NSNumber numberwhithint:…]
似乎不起作用

谢谢


从评论中:

NSLog(@" %@ %@ ", [NSNumber numberWithLong:kABPersonFirstNameProperty], kABPersonFirstNameProperty);

打印:0(空)有什么想法吗?

+[NSNumber numberWithInteger:
将在所有32位和64位系统上很好地保存32位数字<代码>+[NSNumber integerValue]将检索它。如果需要未签名,可以使用“`+[NSNumber numberWithUnsignedInteger:”。

正如其他人所说,
NSNumber
将适用于此。但是,您至少应该模糊地了解另外两个选项:
CFDictionary
(与引擎盖下的
NSDictionary
相同,但它允许您存储任意指针或指针大小的整数)和
NSMapTable

在这种情况下,使用NSNumber似乎是最好的主意

对于较难的情况,可以始终使用NSValue或NSData将任何类型或指针放入可存储在Cocoa集合中的Objective-C对象中

int32_t myInt = 42;
NSValue *myValue = [NSValue value:&myInt withObjCType:@encode(int32_t)];

我在这里假设Dave的问题特定于kAB。。。常量——我可能弄错了,在这种情况下忽略以下内容:)

我相信这里的问题不是你使用了错误的语法;这是一个顺序初始化问题。我猜您在初始化kAB之前正在尝试此操作。。。常量--例如,通过调用
ABAddressBookCreate()
。有点让人困惑的是这个片段:

NSLog(@“%@%@,[NSNumber numberwhithlong:kabbersonfirstnameproperty],kabbersonfirstnameproperty]

应该是:

NSLog(@“%@%d”,[NSNumber numberwhithlong:kabbersonfirstnameproperty],kabbersonfirstnameproperty]

这是我的输出——在调用
ABAddressBookCreate()
之前:

NSLog(@“检查:%d%d%d”、kABPersonFirstNameProperty、kABPersonMiddleNameProperty、kABPersonLastNameProperty)

产生

支票:0

调用后,将生成相同的log语句

支票:061


NSNumber
怎么不适合你?使用.NSLog(@“%@%@,[NSNumber numberwhithlong:kabbersonfirstnameproperty],kabbersonfirstnameproperty]是完全正确的;打印:0(空)有什么想法吗?戴夫:这是正确的输出。在第二个格式化程序中,您传递了当前定义为零的
kabbersonfirstnameproperty
(一个整数名),您告诉
NSLog
您将给它一个对象指针。它将零打印为对象指针,即
NULL
,在输出中显示为“(NULL)”。第一个格式化程序还接受一个对象,您给了它一个:一个值为零的NSNumber对象(
KabbersonfirstNameProperty
)。输出中显示的是该对象的描述,即“0”。因此,代码工作正常,完全符合您的预期。您只是读错了。(实际上,不太好。如果您在第二位传递其他名称,您将崩溃,因为您仍在尝试将整数[
kAB…Property
]打印为对象[
%@
]。有关格式说明符的列表,请参阅,以便查看哪一个是正确的。)虽然您所说的是正确的,我认为在这种情况下,这是相当误导的,因为:A)问题中使用的
numberwhithint:
方法也是如此(在所有32位和64位系统上都很好地保留32位数字),B)@Dave的问题显然在别处。
numberwhite:
将为某些32位值生成负数,而'numberwhiteger:'将不会。我认为这是他的问题,因为在他把问题具体化之前我已经回答了。当我编译之前针对iOS 6的工作(即非零常量)代码时,我所有的常量开始返回零。修复方法是在使用任何ABAddressBook
kABPerson*
之前调用ABAddressBookCreate()
“常量”。