如何使用NSLog从NSManagedObject打印NSInteger值

时间:2009-10-06 23:32:55

标签: objective-c iphone

当我尝试将一个整数值打印到从NSManagedObject检索到的控制台时,它会显示一个6位或8位数值(对象ID?)。但是,如果我使用调试器'打印描述到控制台'显示为我期望的单个数字值。

例如,我将对象'sequence'分配给NSInteger,然后使用NSLog格式字符串显示:

MyProcess *myProcess = [array objectAtIndex:i];
NSInteger sequence = [[NSNumber numberWithInteger:(NSInteger)myProcess.sequence] intValue];
NSLog(@"sequence = %d",myProcess.sequence);

控制台输出为:

2009-10-06 16:11:05.871 MyProcess[33185:20b] sequence = 565256

但是当我从调试器尝试“打印到控制台”时,我看到值1:

<MyStoryImage: 0x3f59a80> (entity: MyObject; id: 0x3f2d540 <x-coredata://FF21959A-  4B67-4587-A25F-66A7B8139DFA/MyProcess/p2> ; data: {
sequence = 1;
<x-coredata://FF21959A-4B67-4587-A25F-66A7B8139DFA/MyProcess/p1>;
})

感谢您的帮助!

5 个答案:

答案 0 :(得分:12)

我认为你从NSManagedObject获得的是一个NSNumber。 打印很容易:

MyProcess *myProcess = [array objectAtIndex:i];
NSLog(@"sequence = %@", myProcess.sequence);

或者,如果你真的需要NSInteger:

MyProcess *myProcess = [array objectAtIndex:i];
NSLog(@"sequence = %i", [myProcess.sequence integerValue]);

我认为在这段代码中

NSInteger sequence = [[NSNumber numberWithInteger:(NSInteger)myProcess.sequence] intValue];

(NSInteger)myProcess.sequence实际获取NSNumber的内存地址。您不能只将NSNumber转换为NSInteger。

答案 1 :(得分:1)

听起来myProcess.sequence是NSNumber(对象)而不是NSInteger(标量)。这可以解释为什么它在对象的描述中正确显示,但是当您明确地尝试将其打印为整数时则不能。

答案 2 :(得分:0)

根据应用程序的构建方式,NSInteger可能是32位,也可能是64位。如果它是64位值,则需要执行

NSLog(@"sequence = %qi", sequence) 

以便它将sequence正确地视为64位值。但请注意,这不适用于32位应用程序;据我所知,没有一种格式说明符可以在32位和64位世界中打印NSInteger。

答案 3 :(得分:-1)

NSInteger只是一个int:

typedef int NSInteger;

在第一行代码中:

NSInteger sequence = [[NSNumber numberWithInteger:(NSInteger)sequence] intValue];

你正在做的就是在一个回合的路上为自己分配序列。由于它没有初始化,它可能是任意随机数。

答案 4 :(得分:-1)

试试这个:

NSLog(@"sequence = %li",(unsigned long)myProcess.sequence);