查看字符串格式说明符以了解如何格式化 NSLog 语句。使用 NSLog 很容易变得懒惰,因为对象具有返回格式化字符串的内置 -description 方法。对于缩放器值,您必须使用正确的格式化程序。
因为当您从硬件转移到硬件时精度会发生变化,所以最好养成使用对象转换为日志值的习惯。在这种情况下:
NSLog(@"%@", [[NSNumber numberFromInt:myObject.myId] stringValue]);
这将始终正确打印。
编辑#1:我道歉。当我写上面的时候,我被剥夺了睡眠。我真正的意图是警告不要使用简单的int
vsNSInteger
以及使用NSNumber numberWithInteger:
.
考虑以下在 64 位硬件上运行。
int x=pow(2,63);
NSLog(@"x=%d",x); //prints x=2147483647
NSInteger n=pow(2,63);
NSLog(@"n=%d",n); // prints n=-1
NSLog(@"n=%@",[[NSNumber numberWithInteger:n] stringValue]); // prints n=9223372036854775807
在过去的 8 位系统中,您总是遇到使用 8 位“int”的问题。运行超过 256 次迭代的 for 循环需要long
. 使用 32 位int
,您不会看到这些问题,也永远不会养成跟踪int
变量大小的习惯。
这可能会导致几乎无法追踪的有害错误,因为它们只发生在数据中非常具体和罕见的值中。
为 iPhone(或其他未来的手机/平台)写作意味着在潜在的高度可变的硬件上写作,就像我们过去必须做的那样。最好尽早养成使用系统和 API 特定定义的习惯。
编辑#2:
其中 myId 是 int,控制台会给出一些高数,例如 70614496。
(1) 如果每次运行时它都会打印不同的数字,那么您可能在设置时分配了一个指向 int 的指针。NSLog 正确地将指针的值打印为 int。
(2) 如果它每次都打印相同的数字,那么您可能会遇到像我上面的第一次编辑一样的溢出问题。
无论哪种情况,您都需要查看将值分配给id
属性的代码,而不是打印它的位置。