菜鸟教程小白 发表于 2022-12-12 12:41:18

ios - 使用 %i 格式化 NSUInteger


                                            <p><p>我正在查看一份前雇员代码,其中出现了大约 20 个警告:</p>

<pre><code>Values of type &#39;NSUInteger&#39; should not be used as format arguments; add an explicit cast to &#39;unsigned long&#39; 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 = @&#34;&#34;;

      switch (Type) {
            case DTCompType_Year: type = @&#34;year&#34;;
                break;
            case DTCompType_Month: type = @&#34;month&#34;;
                break;            
            case DTCompType_Day: type = @&#34;day&#34;;
                break;            
            case DTCompType_Hour: type = @&#34;hour&#34;;
                break;            
            case DTCompType_Minute: type = @&#34;minute&#34;;
                break;            
            case DTCompType_Second: type = @&#34;second&#34;;
                break;            
            case DTCompType_Meridiem: type = @&#34;meridiem&#34;;
                break;            
            case DTCompType_MonthName: type = @&#34;month_name&#34;;
                break;
            case DTCompType_DayOfTheWeek: type = @&#34;day_of_the_week&#34;;
                break;
            case DTCompType_Undefined: type = @&#34;undefined&#34;;
                break;            
      }

      return Length == 0 ? &#34;, type] :
      &#34;, 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&#39;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 &amp;&amp; !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]
查看完整版本: ios - 使用 %i 格式化 NSUInteger