【问题标题】:Is there a better way to avoid 'Sign comparison' warning when comparing NSIndexPath's row and NSArray count?在比较 NSIndexPath 的行数和 NSArray 计数时,是否有更好的方法来避免“符号比较”警告?
【发布时间】:2014-03-10 14:16:50
【问题描述】:

我在 XCode 中为我的 iOS 项目打开了“签名比较”(又名 -Wsign-compare)警告(令人惊讶的是,默认情况下它是关闭的)。之后出现了很多这样的警告:

/Users/michalciuba/projects/GlobeMobile/Classes/ACMailController.m:86:19: Comparison of integers of different signs: 'NSInteger' (aka 'long') and 'NSUInteger' (aka 'unsigned long')

它们通常是由比较NSIndexPathNSIntegerrow 属性与NSArray 的'count' 方法返回的值引起的,如下所示:

if(indexPath.row < [self.myDataArray count]) 

可以通过强制转换来简单地修复警告:

if(indexPath.row < (NSInteger)[self.myDataArray count]) 

但是,如果每个地方都在比较这些值,则必须这样做。他们正在几十个地方进行比较。 我想知道是否有更好更聪明的方法来解决这个问题?我不想关闭此警告,因为它可能有助于防止无符号整数下溢等问题。

【问题讨论】:

  • 试试if(indexPath.row &lt;= self.myDataArray.count-1)
  • 这仍然会触发警告。当 myDataArray 为空时它会失败(因为 NSUInteger 下溢)。实际上这就是我打开这个警告的原因:)

标签: ios objective-c clang nsinteger nsuinteger


【解决方案1】:

你可以实现一个为你做这件事的类别:

@implementation NSArray (SignedCount)

- (NSInteger) signedCount
{
    NSInteger count = (NSInteger)[self count];
    return count;
}

@end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-29
    • 2011-05-28
    • 2013-11-11
    相关资源
    最近更新 更多