ios - 使用 %i 格式化 NSUInteger
<p><p>我正在查看一份前雇员代码,其中出现了大约 20 个警告:</p>
<pre><code>Values of type 'NSUInteger' should not be used as format arguments; add an explicit cast to 'unsigned long' instead
</code></pre>
<p>出现这种情况的部分代码是:</p>
<pre><code>NSUInteger Length;
</code></pre>
<p>与:</p>
<pre><code>- (NSString *) description {
// If no value was given, display type
if( == 0)
{
NSString *type = @"";
switch (Type) {
case DTCompType_Year: type = @"year";
break;
case DTCompType_Month: type = @"month";
break;
case DTCompType_Day: type = @"day";
break;
case DTCompType_Hour: type = @"hour";
break;
case DTCompType_Minute: type = @"minute";
break;
case DTCompType_Second: type = @"second";
break;
case DTCompType_Meridiem: type = @"meridiem";
break;
case DTCompType_MonthName: type = @"month_name";
break;
case DTCompType_DayOfTheWeek: type = @"day_of_the_week";
break;
case DTCompType_Undefined: type = @"undefined";
break;
}
return Length == 0 ? ", type] :
", type, Length];
}
</code></pre>
<p>在苹果文档中找不到 <code>%i</code></p>
<p> <a href="https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/Strings/Articles/formatSpecifiers.html" rel="noreferrer noopener nofollow">Apple's Documentation</a> </p>
<p>我以前从未使用过 Objective-C,现在我必须更新这个应用程序。我知道这需要成为一个无符号长,但我不想在不知道为什么的情况下开始改变事情。该应用程序可以正常工作,那么将这些更改为 unsigned long 是否有任何内在后果?甚至将格式说明符从 <code>%i</code> 更改为 <code>%lu</code>?</p>
<p>根据我的阅读,这可能是平台的问题。 (32 位与 64 位)</p>
<p>这是为 iOS7 中的 iPad 2 开发的,我们刚刚将 SDK 升级到 iOS8。</p>
<p>我发现了这个帖子:
<a href="https://stackoverflow.com/questions/22671347/nsuinteger-should-not-be-used-in-format-strings" rel="noreferrer noopener nofollow">NSUInteger should not be used in format strings?</a>
这给了我一些指导,但我需要更多说明。</p></p>
<br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
<p><p><code>%i</code> 等价于 <code>%d</code>。从技术上讲,你应该一直在使用 <code>%u</code> 。正如您所怀疑的,问题是 32 位与 64 位; <code>NSInteger</code> 在 32 位版本上是 <code> int</code>,但在 64 位版本上是 <code> long</code>。因为 iPhone 是 little-endian,所以只要 <code>%i/d/u</code> 是最后指定的格式,它就会“工作”,但它仍然是错误的。您应该将参数转换为格式说明符期望的类型 (<code>int</code>/<code>long</code>/<code>unsigned</code>/<code>unsigned long</code> ),正如警告消息告诉您的那样。</p>
<p>来自 <objc/NSObjCRuntime.h>:</p>
<pre><code>#if __LP64__ || (TARGET_OS_EMBEDDED && !TARGET_OS_IPHONE) || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64
typedef long NSInteger;
typedef unsigned long NSUInteger;
#else
typedef int NSInteger;
typedef unsigned int NSUInteger;
#endif
</code></pre></p>
<p style="font-size: 20px;">关于ios - 使用 %i 格式化 NSUInteger,我们在Stack Overflow上找到一个类似的问题:
<a href="https://stackoverflow.com/questions/26871770/" rel="noreferrer noopener nofollow" style="color: red;">
https://stackoverflow.com/questions/26871770/
</a>
</p>
页:
[1]