NSUInteger不应该在格式string中使用?

这是我的代码在所有荣耀:

[NSString stringWithFormat:@"Total Properties: %d", (int)[inArray count]]; 

这让我一个Xcode 5.1的警告:

 Values of type 'NSUInteger' should not be used as format arguments; add an explicit cast to 'unsigned long' instead 

好,所以我很困惑。 该值实际上是一个32位整数,并将其转换为32位整数。 那么这是什么NSUInteger它抱怨(我假设伯爵),为什么不能修复它?

NSUInteger和NSInteger在32位(int)和64位(long)上长度不同。 为了使一个格式说明符适用于两种体系结构,您必须使用一个长说明符并将该值转换为long:

 Type Format Specifier Cast ---- ---------------- ---- NSInteger %ld long NSUInteger %lu unsigned long 

所以,例如,你的代码变成:

 [NSString stringWithFormat:@"Total Properties: %lu", (unsigned long)[inArray count]]; 

有很less的工作要做,真的,因为Xcode的Fix-Itfunction会自动为你做这个。

对于与CPU无关的格式string,也可以使用“z”和“t”修饰符

 NSInteger x = -1; NSUInteger y = 99; NSString *foo = [NSString stringWithFormat:@"NSInteger: %zd, NSUInteger: %tu", x, y]; 

NSUInteger的基础types根据平台而变化:它是32位平台上的32位无符号整数,以及64位平台上的64位无符号整数。

string编程指南Platform Dependencies部分中 Applebuild议您执行以下操作:

为了避免需要根据平台使用不同的printf-styletypes说明符,可以使用表3中所示的说明符。请注意,在某些情况下,您可能需要转换值。

对于NSUInteger使用格式%lu%lx ,并将值转换为unsigned long

因此,您的代码需要更改如下,以避免警告:

 [NSString stringWithFormat:@"Total Properties: %lu", (unsigned long)[inArray count]]; 

你也可以尝试使用NSNumber方法:

 [NSString stringWithFormat:@"Total Properties: %@", [[NSNumber numberWithUnsignedInteger:[inArray count]] stringValue]];